其他分享
首页 > 其他分享> > UPC2020寒假训练第一场

UPC2020寒假训练第一场

作者:互联网

问题 A: 数列

时间限制: 1 Sec 内存限制: 128 MB

题目描述
联欢会上,主持人先在黑板上写了四个数字,分别是:2,0,1,9,然后说:“这串数字从第五个数起,每一个数都是它前四数字之和的个位数字”。请你打印输出这个数列的前N项,并计算前N项的和。
输入
单个整数:表示项数N(1 ≤ N ≤ 100000)
输出
第一行:N个数字,表示所求数列的前N项。
第二行:单个数字,表示前N项数字的和
样例输入 Copy
10
样例输出 Copy
2 0 1 9 2 2 4 7 5 8
40

#include<bits/stdc++.h>
using namespace std;
int main()
{   int n,i,ans=12,a[100002];
    cin>>n;
    a[1]=2,a[2]=0,a[3]=1,a[4]=9;
    for(i=5;i<=n;i++)
    {
        a[i]=(a[i-1]+a[i-2]+a[i-3]+a[i-4])%10;
        ans+=a[i];
    }
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);
    printf("\n");
    if(n==1||n==2) cout<<"2";
    else if(n==3)  cout<<"3";
    else if(n==4) cout<<"12";
    else cout<<ans;
    return 0; 
} 

问题 B: 烦恼

时间限制: 1 Sec 内存限制: 128 MB

题目描述
老师每天都要批改作文,他想知道这篇作文有多少字符,以及多少单词,请你帮助他。
输入
单独一行字符串:表示作文的内容,保证只出现大小写英文字母、数字或空格。
输出
第一行:单个整数,表示输入字符串中的可见字符的个数。英文字母和数字属于可见字符,空格和换行属于不可见字符。
第二行:单个整数,表示输入字符串中的单词个数。单词是指连续的,由可见字符组成的字符串。
样例输入 Copy
【样例1】
One apple a day
【样例2】
7 days a week
样例输出 Copy
【样例1】
12
4
【样例2】
10
4
提示
设输入字符串长为|S|,保证1 ≤ |S| ≤ 100000,两个相邻的单词间有且仅有一个空格。

这题WA了几次

#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{   int ans=0,sum=1,i;
    getline(cin,s);
    for(i=0;i<s.size();i++)
    {
         
         if(s[i]==' ') sum++;
         else ans++;
    }
    cout<<ans<<endl;
    cout<<sum<<endl;
    return 0;
}

问题 C: 停车计费

时间限制: 1 Sec 内存限制: 128 MB

题目描述
某小区对外来车辆按照如下规则计费:
·半小时内(含半小时),免费;
·超过半小时到六小时(含六小时),每小时 2 元,不足一小时以一小时计算;
·超过六小时,每小时 5 元,不足一小时以一小时计算。
给定车辆的进入和离开时间(保证没有跨过一天的零点),请计算应收金额。
输入
第一行:一个字符串,表示车辆进入小区的时间。
第二行:一个字符串,表示车辆离开小区的时间。
输入采用“HH:MM:SS”的形式表示时间,其中“HH”表示小时,范围为 00 到 23,“MM”
表示分钟,范围为 00 到 59,“SS”描述秒数,范围为 00 到 59。时、分、秒均为两位数。
输出
第一行:表示车辆的停留时间,格式与输入保持相同。
第二行:单个整数,表示停车费用。
样例输入 Copy
【样例1】
10:00:00
14:00:00
【样例2】
12:34:56
20:36:22
【样例3】
23:29:59
23:59:59
样例输出 Copy
【样例1】
04:00:00
8
【样例2】
08:01:26
45
【样例3】
00:30:00
0

这种题建议全部转化成秒来写

#include<bits/stdc++.h>
using namespace std;
long long a[5],b[5];
int main()
{   char s1[30],s2[30];
    int i,t,k,m,p,ans,sum,a1,b1,c1;
    gets(s1);
    gets(s2);
    t=0;
    for(i=0;s1[i];i++)
    {
        if(s1[i]>='0'&&s1[i]<='9') a[t]=s1[i]-'0'+a[t]*10;
        else if(s1[i]==':') t++;
    }
    t=0;
    for(i=0;s2[i];i++)
    {
        if(s2[i]>='0'&&s2[i]<='9') b[t]=s2[i]-'0'+b[t]*10;
        else if(s2[i]==':') t++;
    }
    ans=a[0]*60*60+a[1]*60+a[2];
    sum=b[0]*60*60+b[1]*60+b[2];
    m=sum-ans;
    if(m<=1800) k=0;
    else if(m>1800&&m<=21600) 
    {
        p=m%3600;
        if(p==0) k=2*(m/3600);
        else k=2*(m/3600)+2;
    }
    else if(m>21600)
    {
        p=m%3600;
        if(p==0) k=5*(m/3600);
        else k=5*(m/3600)+5;
    }
    a1=m/3600;
    b1=(m-a1*3600)/60;
    c1=m-a1*3600-b1*60;
    printf("%02d:%02d:%02d\n",a1,b1,c1);
    cout<<k;
}

问题 D: 小区评比

时间限制: 1 Sec 内存限制: 128 MB

题目描述
某城市有 16 个小区,这些小区分别用大写的英文字母 A 到 P 编号。为创建文明城市,工作人员对一些小区进行了检查,并且评出了分数,评分结果可以用以下字符串表示:
分数1小区编号1分数2小区编号2分数3小区编号3⋯ ⋯ 分数n小区编号n#
这串字符串的格式说明如下:
·每个分数都是 1 到 100 之间的整数,也包括 1 和 100;
·每个小区编号都是大写英文字母 A 到 P 中的一个,保证没有重复的编号出现;
·最后一个结束字符为#,表示记录终止。
请你读入数据后统计并分析,输出分数最高和最低的小区编号。
输入
第一行:一个字符串,表示各个小区的分数分布。
输出
第一个字母:表示得分最高的小区编号,如果有多个小区并列最高,只输出字母顺序中最靠前的编号。
第二个字母:表示得分最低的小区编号,如果有多个小区并列最低,只输出字母顺序中最靠前的编号
样例输入 Copy
85K98B87D80F92H78C96A#
样例输出 Copy
BC
提示
A小区96分,B小区98分,C小区78分,D小区87分,F小区80分,H小区92分,K小区85分。最高分是B小区,最低分是C小区。

#include<bits/stdc++.h>
using namespace std;
struct node
{
    char z;
    int ans;
}a[30]; 
int main()
{   int i,t=0,max=0,min=101;
    char x,y,s[10000];
    while(1)
    {
        scanf("%c",&s[i]);
        if(s[i]>='0'&&s[i]<='9') a[t].ans=a[t].ans*10+s[i]-'0';
        else if(s[i]>='A'&&s[i]<='Z')    
        {
            a[t].z=s[i];
            t++;
        }
        else if(s[i]=='#') break;
            i++;
    }
    for(i=0;i<t;i++)
    {   
        if(a[i].ans>max) 
            {
                max=a[i].ans;
                x=a[i].z;
            }
        if(a[i].ans==max)
        {
            if(a[i].z<x)
                x=a[i].z;
        }
    }
    for(i=0;i<t;i++)
    {
        if(a[i].ans<min) 
        {
            min=a[i].ans;
            y=a[i].z;
        }
        if(a[i].ans==min)
        {
            if(a[i].z<y)
                y=a[i].z;
        }
    }
     
    printf("%c%c",x,y);
    return 0;
}

问题 E: 贪婪的国王

时间限制: 1 Sec 内存限制: 128 MB

题目描述
有个国王喜欢不断积累金币,有一天,他向国民宣布了新的征收办法:
·第一天,国民要向国王缴纳一枚金币;
·第二天和第三天,国民每天要向国王缴纳两枚金币;
·在之后的三天,也就是第四、第五、第六天,国民每天要向国王缴纳三枚金币;
·在之后连续四天,也就是第七、八、九、十天,每天缴纳四枚金币;
总结来说,当国民连续n天每天缴纳了n枚金币之后,国王要求在接下来的n + 1天里每天缴纳n + 1枚金币。
国王有个目标数量T,请问需要征收多少天金币,才能让国王的金币数量大于或等于T?
输入
单个整数:表示征收金币的目标数量T(1 ≤ T ≤ 100000000)。
输出
单个整数:表示达到目标数量的天数。
样例输入 Copy
【样例1】
14
【样例2】
29822
样例输出 Copy
【样例1】
6
【样例2】
1001
提示
样例1解释:每天征收的金币数量分别为1 + 2 + 2 + 3 + 3 + 3 = 14

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,i,m,ans=0,t=0;
    scanf("%lld",&n);
    for(i=1;;i++)
    {
        ans+=i*i;
        if(ans>=n) break;
         
    }
    m=i;
    for(i=1;i<=m;i++)
        t+=i;
    while(ans>n)
    {
        ans=ans-m;
        t--;
    }
    if(ans<n) t++;
    printf("%lld",t);
    return 0;
}

问题 G: 甜蜜的烦恼

时间限制: 1 Sec 内存限制: 128 MB

题目描述
最近珍珍学会了使用电脑,她发现可以利用电脑解决很多事情,并且效率会快许多。比如,在一份名单中找某个人的姓名,在以前,她得依次逐个查找,速度慢又很容易看错。现在,她使用菜单命令:“编辑”-“查找”(或按Ctrl+F键),在弹出的查找对话框中,输入要查找的姓名,电脑就会找到要找的姓名或告诉你不存在你要找的姓名了。真是又快又准,太爽了!

今天珍珍在查找时,输入“张明”,电脑告诉她不存在,但她不经意间发现“张 明”是有的!原来,提供原始名单的人,为了格式漂亮在中间输入了一个空格,因此电脑找不到了。她想这容易解决,继续查找“李达”,没有?查找“李 达”(中间一个空格),还没有?原来某些姓名中间的空格数是有多个的!

珍珍想删除所有姓名中间的空格,但由于名单很多,一个一个删除太慢了,所以她找到了会编程解决问题的你,请你写一个程序,删除所有名单中间的空格。
输入
输入的第一行只有一个正整数n,表示名单中共有n个人的姓名。
第二行至第n+1行共n行,每行是一个人的姓名(由大小写英文字母以及字母之间的空格组成)。
输出
输出有n+1行,第一行只有一个正整数,表示总共删除的空格数。
第二行至第n+1行共n行,每行表示一个删除空格后的姓名(按照输入姓名的次序)。
样例输入 Copy
3
ZhangMing
Li Da
Wu Ya Fei
样例输出 Copy
5
ZhangMing
LiDa
WuYaFei
提示
100%的数据,1≤n≤10000,每行姓名的字符数不超过100。

输出的时候为了去掉空格可以一个字母一个字母的输出

#include<bits/stdc++.h>
using namespace std;
char s[10005][103];
int main()
{   int n,i,j,ans=0;
    cin>>n;
    getchar();
    for(i=0;i<n;i++)
    {
        gets(s[i]);
        for(j=0;s[i][j];j++)
        {
            if(s[i][j]==' ') ans++;
        }
         
    }
    printf("%d\n",ans);
    for(i=0;i<n;i++)
    {
        for(j=0;s[i][j];j++)
        {
            if(s[i][j]!=' ') printf("%c",s[i][j]);
        }
        printf("\n");
    }
    return 0;
}

问题 I: 分数统计I

时间限制: 1 Sec 内存限制: 1024 MB

题目描述
学校为了控制作业量,实施“轻负担,高质量”的有效教学,对所有在校学生的作业量情况进行了调查。每个学生填写做作业所需要的时间。最后统计出所有学生做作业时间的平均值。
为了避免个别学生不客观填写的影响,规定学生的填写的数字应该为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%最少时间的学生后,所有合法填写学生做作业的平均时间;
样例输入 Copy
7
10
60
80
70
90
110
100
样例输出 Copy
68.33
75.00
提示
所有学生做作业的平均时间为:(10+60+80+70+90+100)/6=68.33
10%的学生数为:7*10%=0.7≈1(四舍五入至整数)
除最快和最慢的1个学生外,做作业的平均时间为:
(60+80+70+90)/4=75.00
30%的数据,5≤n≤10,且所有学生填写的做作业时间均在1至100之间。
100%的数据,5≤n≤1000。学生填写的数据保证为整数,合法填写的学生数保证大于10%的学生数(四舍五入至整数后)的2倍。

按提示做即可

#include<bits/stdc++.h>
using namespace std;
int main()
{   
    int n,m,x,j=0,a[1002],i;
    double p,k,s,ans=0;
    cin>>n;
    m=n;
    for(i=0;i<n;i++)
        {   cin>>x;
            if(x>=1&&x<=100) 
                {
                    a[j++]=x;
                    ans+=x;
                     
                }
            else  m--;
        }
     
    p=ans/m*1.0;
    x=int(n*0.1+0.5);
    sort(a,a+m);
    for(i=x;i<m-x;i++)
        s+=a[i];
    k=s/(m-2*x);
    printf("%.2lf\n%.2lf",p,k);
    return 0;   
}

问题 F: 等边三角形

时间限制: 1 Sec 内存限制: 128 MB

题目描述
将一个等边三角形的三条边分别n等分,沿着三条边的方向做这些等分点的平行线,就得到了一个三角网格。例如n = 6时的网格如图所示:
在这里插入图片描述

这个网络中有很多三角形。请求出有多少不同的三角形,并且求出这些不同三角形的面积之和。
两个三角形如果大小不同,或方向不同,或位置不同,则视作两个不同的三角形。在求面积的时候,视网格中最小的三角形面积为1。
输入
单个整数:表示n(2 ≤ n ≤ 500)。
输出
第一行,单个整数:表示不同三角形的数量。
第二行,单个整数:表示不同三角形的面积总和。
样例输入 Copy
4
样例输出 Copy
27
87

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long  n, ans = 0, sum = 0, s[505], i, j, y;
    cin >> n;
    for (i = 1; i <= n; i++)   
        s[i] = pow(i, 2);     //由题意得,最小的三角形面积为1,边长为2的三角形面积为4,一次类推
    for (i = 1; i <= n; i++)   //第一层循环枚举三角形的边长
    {
        for (j = 1; j <= n - i + 1; j++) //第二层的循环枚举正着的三角形的个数,如边长为1的有1+2+3+。。。n,边长为n有n个
        {
            ans += j;
            sum += j * s[i];
        }
        for (y = 1; y <= n - 2 * i + 1; y++)//倒着的三角形
        {
            ans += y;
            sum += y * s[i];
        }
    }
    cout << ans << endl;
    cout << sum << endl;
    return 0;
}
}

问题 J: 平方数
时间限制: 1 Sec 内存限制: 128 MB

题目描述
珍珍学习乘法时,发现4=22,9=33,…,而2不可能分解为二个相同整数的乘积,但可以分解为11+11。她想知道对任意的正整数n,把它分解为几个整数与自身相乘之和,有多少种方案呢?
输入
输入只有一行,该行只有一个正整数n。
输出
输出只有一行,该行只有一个正整数,表示总方案数。
样例输入 Copy
13
样例输出 Copy
6
提示
30%的数据,1≤n≤10;
80%的数据,1≤n≤300;
100%的数据,1≤n≤800。

#include<bits/stdc++.h>
using namespace std;
int n,a[1000][1000];
int dfs(int x,int count)
{
    if(count==n) return 1;
    if(count>n) return 0;
    if(x>sqrt(n)) return 0;
    if(a[x][count])
        return a[x][count];
    for(int i=x;i<=sqrt(n);i++)
        a[x][count]+=dfs(i,count+i*i);
    return a[x][count];
}
int main()
{
    cin>>n;
    cout<<dfs(1,0);
    return 0;
}

问题 H: 冰壶比赛
时间限制: 1 Sec 内存限制: 128 MB

题目描述
在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,表示此时发生弃权情况。
输出
输出有若干行,每行有二个整数,中间以一个冒号分隔,表示每一局比赛甲乙双方的比分(甲得分在前)。
最后一行有二个整数,中间以一个冒号分隔,表示甲乙双方比赛的最终得分(甲得分在前)。
样例输入 Copy
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
样例输出 Copy
0:1
0:0
3:0
3:1
提示
70%的数据,双方均不弃权,比赛进行10局。
100%的数据,每只冰壶距离目标点P的距离不超过100。

#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
int r, a[10], b[10], f, t, y, ans, sum,k,m,flag;
int main()
{
    cin >> r;
    int i,j;
    for (i = 1; i <= 10; i++)
    {
        k = 0; m = 0;
        for (j = 0; j < 8; j++)
        {
            cin >> a[j];
            if (a[j] == -1)
            {
                cout << sum << ":" << ans;
                return 0;
            }
        }
            for (j = 0; j < 8; j++)
                cin >> b[j];
            sort(a, a + 8);
            sort(b, b + 8);
            if (a[0] == b[0])  cout << "0:0" << endl;
            else if (a[0] < b[0])
            {
                for (j = 0; j < 8; j++)
                {
                    if (a[j] < b[0] && a[j] <= r) k++;
                     
                }
                cout << k << ":" << "0"<<endl;
                sum += k;
 
            }
            else if (a[0] >b[0])
            {
                for (j = 0; j < 8; j++)
                {
                    if (b[j] < a[0] && b[j] <= r)  m++;
                }
                cout << "0" << ":" << m<<endl;
                ans += m;
            }
             
             
         
    }
    cout << sum<< ":" << ans;
    return 0;
}

问题 K: 分数统计II
时间限制: 1 Sec 内存限制: 128 MB

题目描述
学校为了控制作业量,实施“轻负担,高质量”的有效教学,对所有在校学生的作业量情况进行了调查。每个学生对每门课的日均作业时间进行评估。最后统计出每门课的日均作业时间的平均值,作为学校评价习题教学效果的一个重要参考。
为了避免个别学生不客观评估的影响,学生的评估值必须为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门课的日均作业时间的平均值;
样例输入 Copy
7 2
10 11
60 69
70 73
80 87
90 91
100 100
110 100
样例输出 Copy
68.33 75.86
75.00 84.00
提示
第1门课所有学生日均作业时间平均值为:(10+60+70+80+90+100)/6=68.33
第2门课所有学生日均作业时间平均值为:(11+69+73+87+91+100+100)/7=75.86
10%的学生数为:7*10%=0.7≈1(四舍五入至整数)
除最高和最低学生外,第1门课日均作业时间平均值为:(60+70+80+90)/4=75.00
除最高和最低学生外,第2门课日均作业时间平均值为:(69+73+87+91+100)/5=84.00
70%的数据,5≤n≤1000;
100%的数据,5≤n≤50000, 1≤m≤6,学生填写的数据保证为整数,合法填写的学生总数保证大于10%的学生数(四舍五入至整数后)的2倍。

#include<bits/stdc++.h>
using namespace std;
int n,m,a[50010][20],b[20][50010],k,len;
double sum1,sum2,c[10];
int main()
{   int i,j;
    cin>>n>>m;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
            scanf("%d",&a[i][j]);
             
    }
    for(j=0;j<m;j++)
    {
        for(i=0;i<n;i++)
            b[j][i]=a[i][j];
    }
    for(i=0;i<m;i++)
    {
        vector<int>q;
        sum1=sum2=0;
        for(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(j=k;j<len-k;j++)
            sum2+=q[j];
        c[i]=sum2/(len-2*k);
             
                 
         
         
    }
    printf("\n");
     for(int i=0;i<m;i++)
      printf("%.2lf ",c[i]);
  return 0;
 } 

标签:输出,int,样例,寒假,第一场,ans,UPC2020,Copy,输入
来源: https://blog.csdn.net/qq_51235689/article/details/112760249