1.9UPC寒假个人训练第一场
作者:互联网
1.9UPC寒假个人训练第一场
- 问题 A: 数列
- 问题 B: 烦恼
- 问题 C: 停车计费
- 问题 D: 小区评比
- 问题 E: 贪婪的国王
- 问题 F: 等边三角形
- 问题 G: 甜蜜的烦恼
- 问题 H: 冰壶比赛
- 问题 I: 分数统计I
- 问题 J: 平方数
- 问题 K: 分数统计II
问题 A: 数列
题目描述
联欢会上,主持人先在黑板上写了四个数字,分别是:2,0,1,9,然后说:“这串数字从第五个数起,每一个数都是它前四数字之和的个位数字”。请你打印输出这个数列的前N项,并计算前N项的和。
输入
单个整数:表示项数N(1 ≤ N ≤ 100000)
输出
第一行:N个数字,表示所求数列的前N项。
第二行:单个数字,表示前N项数字的和
样例输入
10
样例输出
2 0 1 9 2 2 4 7 5 8
40
# include<bits/stdc++.h>
using namespace std;
int n,a[100005],ans,s;
int main(){
cin>>n;
a[1]=2;a[2]=0;a[3]=1;a[4]=9;
if(n==1) {
cout<<2<<endl;
cout<<2<<endl;
}
if(n==2) {
cout<<2<<" "<<0<<endl;
cout<<2<<endl;
}
if(n==3) {
cout<<2<<" "<<0<<" "<<1<<endl;
cout<<3<<endl;
}
if(n==4) {
cout<<2<<" "<<0<<" "<<1<<" "<<9<<endl;
cout<<12<<endl;
}
if(n>=5){
cout<<2<<" "<<0<<" "<<1<<" "<<9;
ans=12;
for(int i=5;i<=n;i++)
{
a[i]=(a[i-1]+a[i-2]+a[i-3]+a[i-4])%10;
ans+=a[i];
cout<<" "<<a[i];
}
cout<<endl;
cout<<ans<<endl;
}
}
问题 B: 烦恼
题目描述
老师每天都要批改作文,他想知道这篇作文有多少字符,以及多少单词,请你帮助他。
输入
单独一行字符串:表示作文的内容,保证只出现大小写英文字母、数字或空格。
输出
第一行:单个整数,表示输入字符串中的可见字符的个数。英文字母和数字属于可见字符,空格和换行属于不可见字符。
第二行:单个整数,表示输入字符串中的单词个数。单词是指连续的,由可见字符组成的字符串。
样例输入
【样例1】
One apple a day
【样例2】
7 days a week
样例输出
【样例1】
12
4
【样例2】
10
4
# include<bits/stdc++.h>
using namespace std;
int ans,res;
string s;
int main(){
getline(cin,s);
for(int i=0;i<s.size();i++){
if(s[i]!=' ') ans++;
else res++;
}
cout<<ans<<endl<<res+1<<endl;
return 0;
}
问题 C: 停车计费
题目描述
某小区对外来车辆按照如下规则计费:
·半小时内(含半小时),免费;
·超过半小时到六小时(含六小时),每小时 2 元,不足一小时以一小时计算;
·超过六小时,每小时 5 元,不足一小时以一小时计算。
给定车辆的进入和离开时间(保证没有跨过一天的零点),请计算应收金额。
输入
第一行:一个字符串,表示车辆进入小区的时间。
第二行:一个字符串,表示车辆离开小区的时间。
输入采用“HH:MM:SS”的形式表示时间,其中“HH”表示小时,范围为 00 到 23,“MM”
表示分钟,范围为 00 到 59,“SS”描述秒数,范围为 00 到 59。时、分、秒均为两位数。
输出
第一行:表示车辆的停留时间,格式与输入保持相同。
第二行:单个整数,表示停车费用。
样例输入
【样例1】
10:00:00
14:00:00
【样例2】
12:34:56
20:36:22
【样例3】
23:29:59
23:59:59
样例输出
【样例1】
04:00:00
8
【样例2】
08:01:26
45
【样例3】
00:30:00
0
# include<bits/stdc++.h>
using namespace std;
int ans,res,hh1,hh2,mm1,mm2,ss1,ss2,h,m,s;
int main(){
scanf("%d:%d:%d",&hh1,&mm1,&ss1);
scanf("%d:%d:%d",&hh2,&mm2,&ss2);
s=ss2-ss1;
if(s<0) s+=60,mm2--;
m=mm2-mm1;
if(m<0) m+=60,hh2--;
h=hh2-hh1;
printf("%02d:%02d:%02d\n",h,m,s);
ans=h*3600+m*60+s;
if(ans<=1800) cout<<0<<endl;
else if(ans<=21600) {
if(ans%3600==0) cout<<ans/3600*2<<endl;
else cout<<ans/3600*2+2<<endl;
}
else {
if(ans%3600==0) cout<<ans/3600*5<<endl;
else cout<<ans/3600*5+5<<endl;
}
return 0;
}
问题 D: 小区评比
题目描述
某城市有 16 个小区,这些小区分别用大写的英文字母 A 到 P 编号。为创建文明城市,工作人员对一些小区进行了检查,并且评出了分数,评分结果可以用以下字符串表示:
分数1小区编号1分数2小区编号2分数3小区编号3⋯ ⋯ 分数n小区编号n#
这串字符串的格式说明如下:
·每个分数都是 1 到 100 之间的整数,也包括 1 和 100;
·每个小区编号都是大写英文字母 A 到 P 中的一个,保证没有重复的编号出现;
·最后一个结束字符为#,表示记录终止。
请你读入数据后统计并分析,输出分数最高和最低的小区编号。
输入
第一行:一个字符串,表示各个小区的分数分布。
输出
第一个字母:表示得分最高的小区编号,如果有多个小区并列最高,只输出字母顺序中最靠前的编号。
第二个字母:表示得分最低的小区编号,如果有多个小区并列最低,只输出字母顺序中最靠前的编号。
样例输入
85K98B87D80F92H78C96A#
样例输出
BC
# include<bits/stdc++.h>
using namespace std;
struct Node{
int score;
char id;
}a[100];
string s;
bool cmp(Node a,Node b){
if(a.score == b.score ) return a.id <b.id ;
else return a.score >b.score ;
}
int i,j;
int main(){
cin>>s;
while(s[i]!='#'){
if(isdigit(s[i])) {
while(isdigit(s[i]))
a[j].score =a[j].score *10+s[i++]-'0';
a[j++].id =s[i];
}
i++;
}
sort(a,a+j,cmp);
for(i=j-1;i>=0;i--)
if(a[i].score !=a[i-1].score ) break;
cout<<a[0].id <<a[i].id <<endl;
return 0;
}
问题 E: 贪婪的国王
题目描述
有个国王喜欢不断积累金币,有一天,他向国民宣布了新的征收办法:
·第一天,国民要向国王缴纳一枚金币;
·第二天和第三天,国民每天要向国王缴纳两枚金币;
·在之后的三天,也就是第四、第五、第六天,国民每天要向国王缴纳三枚金币;
·在之后连续四天,也就是第七、八、九、十天,每天缴纳四枚金币;
总结来说,当国民连续n天每天缴纳了n枚金币之后,国王要求在接下来的n + 1天里每天缴纳n + 1枚金币。
国王有个目标数量T,请问需要征收多少天金币,才能让国王的金币数量大于或等于T?
输入
单个整数:表示征收金币的目标数量T(1 ≤ T ≤ 100000000)。
输出
单个整数:表示达到目标数量的天数。
样例输入
【样例1】
14
【样例2】
29822
样例输出
【样例1】
6
【样例2】
1001
# include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,ans,res;
int main(){
cin>>n;
int i=1,j=1;
while(1){
ans+=j;
res++;
if(ans>=n) break;
if(i==j) i=1,j++;
else i++;
}
cout<<res<<endl;
}
问题 F: 等边三角形
题目描述
将一个等边三角形的三条边分别n等分,沿着三条边的方向做这些等分点的平行线,就得到了一个三角网格。例如n = 6时的网格如图所示:
这个网络中有很多三角形。请求出有多少不同的三角形,并且求出这些不同三角形的面积之和。
两个三角形如果大小不同,或方向不同,或位置不同,则视作两个不同的三角形。在求面积的时候,视网格中最小的三角形面积为1。
输入
单个整数:表示n(2 ≤ n ≤ 500)。
输出
第一行,单个整数:表示不同三角形的数量。
第二行,单个整数:表示不同三角形的面积总和。
样例输入
4
样例输出
27
87
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[505],n,ans,res;
ll quick(ll a,ll b){
ll p=1;
while(b){
if(b&1) p=p*a;
a=a*a;
b=b>>1;
}
return p;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
a[i]=quick(i,2);
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i+1;j++)
ans+=j*a[i],res+=j;
for(int k=1;k<=n-2*i+1;k++)
ans+=k*a[i],res+=k;
}
cout<<res<<endl<<ans<<endl;
return 0;
}
问题 G: 甜蜜的烦恼
题目描述
最近珍珍学会了使用电脑,她发现可以利用电脑解决很多事情,并且效率会快许多。比如,在一份名单中找某个人的姓名,在以前,她得依次逐个查找,速度慢又很容易看错。现在,她使用菜单命令:“编辑”-“查找”(或按Ctrl+F键),在弹出的查找对话框中,输入要查找的姓名,电脑就会找到要找的姓名或告诉你不存在你要找的姓名了。真是又快又准,太爽了!
今天珍珍在查找时,输入“张明”,电脑告诉她不存在,但她不经意间发现“张 明”是有的!原来,提供原始名单的人,为了格式漂亮在中间输入了一个空格,因此电脑找不到了。她想这容易解决,继续查找“李达”,没有?查找“李 达”(中间一个空格),还没有?原来某些姓名中间的空格数是有多个的!
珍珍想删除所有姓名中间的空格,但由于名单很多,一个一个删除太慢了,所以她找到了会编程解决问题的你,请你写一个程序,删除所有名单中间的空格。
输入
输入的第一行只有一个正整数n,表示名单中共有n个人的姓名。
第二行至第n+1行共n行,每行是一个人的姓名(由大小写英文字母以及字母之间的空格组成)。
输出
输出有n+1行,第一行只有一个正整数,表示总共删除的空格数。
第二行至第n+1行共n行,每行表示一个删除空格后的姓名(按照输入姓名的次序)。
样例输入
3
ZhangMing
Li Da
Wu Ya Fei
样例输出
5
ZhangMing
LiDa
WuYaFei
# include<bits/stdc++.h>
using namespace std;
int n,ans,res;
string s[10005];
int main(){
cin>>n;
getchar();
for(int i=0;i<n;i++){
getline(cin,s[i]);
for(int j=0;j<s[i].size();j++)
if(s[i][j]==' ') ans++;
}
cout<<ans<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<s[i].size();j++)
if(s[i][j]==' ') continue;
else cout<<s[i][j];
cout<<endl;
}
}
问题 H: 冰壶比赛
题目描述
在3月29日举行的女子冰壶世锦赛决赛中,王冰玉、柳荫、岳清爽和周妍组成的中国女子冰壶队以8比6击败了冬奥会和世锦赛双冠王瑞典队,夺得了中国冰壶历史上第一枚世锦赛金牌,创造了历史。美丽、实力兼具的中国冰壶姑娘们也赢得了超高的赞誉。
在冰壶比赛中,给出一个目标点P,以及一个规定的正整数r。每一局由甲乙两队轮流投冰壶各8次后,该局比赛结束。此时,哪一方的冰壶最终离目标点P更近,该方得分,另一方不得分。得分方每颗离目标点P距离小于或等于r、位置较另一队所有冰壶都更接近目标点P的冰壶都可以得1分。
比赛最多进行10局。双方之间的某局比赛结束后,落后一方可以弃权。此时,比赛不再进行下去。
已知每一局结束时,双方的每个冰壶离目标点P的距离,以及正整数r,请你写一个程序判断两队之间每一局比赛的得分,以及总得分。
输入
输入的第一行只有一个正整数r。
以下有若干行(不超过20行),除了最后一行外,每一行有8个正整数(互相之间以一个空格分隔)。
第2行的第j个数表示第1局比赛结束时,甲方的第j个冰壶距离目标点P的距离;
第3行的第j个数表示第1局比赛结束时,乙方的第j个冰壶距离目标点P的距离;
第4行的第j个数表示第2局比赛结束时,甲方的第j个冰壶距离目标点P的距离;
第5行的第j个数表示第2局比赛结束时,乙方的第j个冰壶距离目标点P的距离;
… …
第2k行的第j个数表示第k局比赛结束时,甲方的第j个冰壶距离目标点P的距离;
第2k+1行的第j个数表示第k局比赛结束时,乙方的第j个冰壶距离目标点P的距离;
如果有一方中途弃权,则最后一行(偶数行)只有一个整数-1,表示此时发生弃权情况。
输出
输出有若干行,每行有二个整数,中间以一个冒号分隔,表示每一局比赛甲乙双方的比分(甲得分在前)。
最后一行有二个整数,中间以一个冒号分隔,表示甲乙双方比赛的最终得分(甲得分在前)。
样例输入
8
5 20 18 19 3 15 13 3
20 2 17 12 5 18 10 11
20 3 4 1 2 11 9 2
1 15 19 9 8 14 11 10
15 2 10 1 19 14 3 18
15 17 21 19 24 32 19 26
-1
样例输出
0:1
0:0
3:0
3:1
# include<iostream>
# include<algorithm>
using namespace std;
typedef long long ll;
ll a[11],b[11],n,x,l=-1,res1,res2,ans1,ans2;
int main(){
cin>>n;
while(cin>>x){
if(x==-1) break;
l++;
if(l<8) a[l]=x;
else b[l-8]=x;
if(l==15){
l=-1; ans1=ans2=0;
sort(a,a+8);
sort(b,b+8);
while(a[ans1]<b[0]&&a[ans1]<=n) ans1++;
while(b[ans2]<a[0]&&b[ans2]<=n) ans2++;
cout<<ans1<<":"<<ans2<<endl;
res1+=ans1; res2+=ans2;
}
}
cout<<res1<<":"<<res2<<endl;
return 0; }
/*****************
问题 I: 分数统计I
题目描述
学校为了控制作业量,实施“轻负担,高质量”的有效教学,对所有在校学生的作业量情况进行了调查。每个学生填写做作业所需要的时间。最后统计出所有学生做作业时间的平均值。
为了避免个别学生不客观填写的影响,规定学生的填写的数字应该为1至100间的正整数,如果某个学生填写了不在此范围内的整数,统计平均值时应该忽略这个学生。现在要求完成:
(1)统计出所有学生做作业时间的平均值;
(2)除去做作业时间前10%的学生和后10%的学生后(10%学生数按四舍五入计),统计做作业时间的平均值。
请你写个程序,完成以上任务。(提示:Pascal语言中, Round(x)为四舍五入函数,在C语言中可使用int(x+0.5))
输入
输入的第1行有1个正整数n。表示有n个人。
第2行至第n+1行共n行,每行只有1个整数,表示每个学生填写的做作业时间。
输出
输出有2行,每行只有1个数(保留2位小数)
第1行只有一个整数,表示所有合法填写学生做作业的平均时间;
第2行只有一个整数,表示除去10%最多时间和10%最少时间的学生后,所有合法填写学生做作业的平均时间;
样例输入
7
10
60
80
70
90
110
100
样例输出
68.33
75.00
# include<iostream>
# include<algorithm>
using namespace std;
int n,a[1005],x,t,m;
double sum;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>x;
if(x>=1&&x<=100) a[t++]=x,sum+=x;
}
printf("%.2lf\n",sum/t);
sum=0;
sort(a,a+t);
m=(int)(n*0.1+0.5);
for(int i=m;i<t-m;i++)
sum+=a[i];
printf("%.2lf",sum/(t-2*m));
return 0;
}
问题 J: 平方数
题目描述
珍珍学习乘法时,发现4=22,9=33,…,而2不可能分解为二个相同整数的乘积,但可以分解为11+11。她想知道对任意的正整数n,把它分解为几个整数与自身相乘之和,有多少种方案呢?
输入
输入只有一行,该行只有一个正整数n。
输出
输出只有一行,该行只有一个正整数,表示总方案数。
样例输入
13
样例输出
6
#include<iostream>
#include<cmath>
using namespace std;
int n;
int a[805][805];
int dfs(int x,int ans)
{
if(ans==n) return 1;
if(ans>n||x>sqrt(n)) return 0;
if(a[x][ans]) return a[x][ans];
for(int i=x;i<=sqrt(n);i++)
a[x][ans] += dfs(i,ans+i*i);
return a[x][ans];
}
int main()
{
cin>>n;
cout<<dfs(1,0);
return 0;
}
问题 K: 分数统计II
题目描述
学校为了控制作业量,实施“轻负担,高质量”的有效教学,对所有在校学生的作业量情况进行了调查。每个学生对每门课的日均作业时间进行评估。最后统计出每门课的日均作业时间的平均值,作为学校评价习题教学效果的一个重要参考。
为了避免个别学生不客观评估的影响,学生的评估值必须为1至100间的正整数,如果某个评估值为不在此范围内的整数,则忽略。现在要求完成:
(1)统计出每门课的日均作业时间的平均值;
(2)除去每门课中作业时间最多的和最少的10%的学生(四舍五入)后,统计平均值。
请你写个程序,完成以上任务。(提示:Pascal语言中, Round(x)为四舍五入函数,在C语言中可使用int(x+0.5))
输入
输入的第1行有2个正整数n,m(以一个空格分隔)。表示有n个人,m门课。
第2行至第n+1行,每行有m个正整数,表示学生对每门课日均作业时间的评估,每个整数之间以一个空格分隔。其中:第k+1行的第j个数表示第k个学生填写的第j门课的日均作业时间;
输出
输出有2行,每行有m个数(保留2位小数,每行的各个数之间以一个空格相互分隔),表示每门课日均作业时间的平均值。其中:
第1行的第j个数表示所有合法填写学生的第j门课的日均作业时间的平均值;
第2行的第j个数表示除去10%最多合法时间和10%最少合法时间的学生后,所有合法填写学生第j门课的日均作业时间的平均值;
样例输入
7 2
10 11
60 69
70 73
80 87
90 91
100 100
110 100
样例输出
68.33 75.86
75.00 84.00
# include<iostream>
# include<algorithm>
# include<vector>
# include<cstdio>
using namespace std;
int n,m,a[50005][10],b[10][50005],k,len;
double sum1,sum2,c[10];
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
for(int j=0;j<m;j++)
for(int i=0;i<n;i++)
b[j][i]=a[i][j];
for(int i=0;i<m;i++){
vector<int >q;
sum1=sum2=0;
for(int j=0;j<n;j++)
if(b[i][j]>=1&&b[i][j]<=100) q.push_back(b[i][j]),sum1+=b[i][j];
len=q.size();
printf("%.2lf ",sum1/len);
k=(int)(0.1*n+0.5);
sort(q.begin(),q.end());
for(int i=k;i<len-k;i++)
sum2+=q[i];
c[i]=sum2/(len-2*k);
}
printf("\n");
for(int i=0;i<m;i++)
printf("%.2lf ",c[i]);
return 0;
}
标签:输出,冰壶,int,样例,1.9,UPC,寒假,include,输入 来源: https://blog.csdn.net/qq_52273733/article/details/112806883