牛客小白月赛3

链接:https://www.nowcoder.com/acm/contest/87/A
来源:牛客网

音标
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描

我们规定元音字母有a、e、i、o、u,并且规定半元音字母y也是元音字母。
Cwbc在学习英语,XHRlyb为了让Cwbc的记忆更加深刻,于是她让Cwbc把每个字符串的所有字母都变成一个 恰好 不大于它本身的小写元音字母
可是Cwbc比较贪玩,并且他想让你帮他完成这个任务。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述:

输入数据有多行,每行有一个仅包含小写字母的字符串。

输出描述:

输出数据应有多行,每行有一个变化后的字符串。
示例1

输入

aeiou

输出

aeiou

说明

元音字母变为一个恰好不大于它本身的字母,也就是元音字母本身
示例2

输入

bfjpv

输出

aeiou

说明

输入样例是由元音字母a、e、i、o、u的后一个字母组成,每个字母变为一个恰好不大于它本身的字母,也就是a、e、i、o、u。

备注:

每行字符串长度不超过2×105,字符串总长度不超过10
6
思路:水题,模拟
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[1000005];
 4 int main(){
 5     while(~scanf("%s",s)){
 6         int len=strlen(s);
 7         for(int i=0;i<len;i++){
 8             if(s[i]>='y'){
 9                 s[i]='y';
10             }
11             else if(s[i]>='u'){
12                 s[i]='u';
13             }
14             else if(s[i]>='o'){
15                 s[i]='o';
16             }
17             else if(s[i]>='i'){
18                 s[i]='i';
19             }
20             else if(s[i]>='e'){
21                 s[i]='e';
22             }
23             else if(s[i]>='a'){
24                 s[i]='a';
25             }
26         }
27         printf("%s\n",s);
28     }
29 } 

链接:https://www.nowcoder.com/acm/contest/87/B
来源:牛客网

躲藏
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏。
Cwbc藏在多个不区分大小写的字符串中。
好奇的XHRlyb想知道,在每个字符串中Cwbc作为子序列分别出现了多少次。
由于Cwbc可能出现的次数过多,你只需要输出每个答案对 2000120420010122取模后的结果。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述:

输入数据有多行,每行有一个字符串。

输出描述:

输出数据应有多行,每行表示一个答案取模后的结果。
示例1

输入

Cwbc

输出

1

说明

Cwbc作为子序列仅出现了1次。
示例2

输入

acdcecfwgwhwibjbkblcmcnco

输出

81

说明

Cwbc作为子序列出现了3
4
=81次。

备注:

每行字符串长度不超过2×105,字符串总长度不超过10
6
思路:反向遍历,记录c的个数,w的个数,b的个数;只有当出现第一个b之后,再出现c才能开始统计个数;
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const long long mod=2000120420010122;
 4 char s[200005];
 5 int main(){
 6     while(~scanf("%s",s)){
 7         int len=strlen(s);
 8         long long c=0,b=0,w=0;
 9         long long  sum_c=0,sum_b=0,sum_w=0; 
10         for(int i=len-1;i>=0;i--){
11             if(s[i]=='c'||s[i]=='C'){
12                 if(sum_b==0)
13                     c=(c+1)%mod;
14                 else{
15                     sum_c=(sum_c+sum_w)%mod;
16                     c=(c+1)%mod;
17                 }
18             }
19             if(s[i]=='b'||s[i]=='B'){
20                 sum_b=(sum_b+c)%mod;
21             }
22             if(s[i]=='w'||s[i]=='W'){
23                 sum_w=(sum_w+sum_b)%mod;
24             }
25         }
26         printf("%lld\n",sum_c);
27     } 
28 } 

链接:https://www.nowcoder.com/acm/contest/87/F
来源:牛客网

异或
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

Cwbc想测试一下他的加密协议,以便防止其他人偷看他给XHRlyb的信。
Cwbc提出了这样一个问题:在区间[a,b]和区间[c,d]中分别等概率随机选择一个整数,两者异或之后等于0的概率是多少?
XHRlyb 一眼就看出了这个题目的答案,但她想让你计算一下这个概率。为了防止精度误差,你只需要输出一个形如a/b的最简分数。特别的,如果概率为0,你需要输出0/1。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述:

输入数据有多行,每行有四个非负整数a, b, c, d。

输出描述:

输出数据应有多行,每行有一个表示答案,形如x/y的最简分数。
示例1

输入

1 2 3 4

输出

0/1
示例2

输入

1 2 2 3

输出

1/4

备注:

a, b, c, d∈[0, 10 9]。
a ≤ b,c ≤ d
1 ≤ T ≤ 1000。
思路:分类讨论;
反思:比赛的时候错了好多次,其实都不应该,自己想偷懒,减少代码量,结果错了,直接把所有情况列出来,反而快点;
代码:
#include<bits/stdc++.h>
using namespace std;
long long a,b,c,d;
long long o(long long a,long long b);
int main(){
    while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&d)){
        long long co=0;
        if(c>b||a>d){
            printf("0/1\n");
            continue;
        }
        else if(a<=c&&b>=c&&d>=b){
            co=b-c+1;
        }
        else if(a>=c&&b<=d){
            co=b-a+1;
        }
        else if(a<=c&&d<=b){
            co=d-c+1;
        }
        else if(a>=c&&d>=a&&d<=b){
            co=d-a+1;
        } 
        long long sum=(b-a+1)*(d-c+1);
        long long t=o(co,sum);
        printf("%lld/%lld\n",co/t,sum/t);
    }
}
long long o(long long a,long long b){
    long long c;
    while(b!=0){
        c=a%b;
        a=b;
        b=c;
    }
    return a;
}
链接:https://www.nowcoder.com/acm/contest/87/H
来源:牛客网

纪年
 
    
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

Cwbc和XHRlyb在学习干支纪年法。
干支纪年法是中国历法上自古以来就一直使用的纪年方法。干支是天干和地支的总称。甲、乙、丙、丁、戊、己、庚、辛、壬、癸等十个符号叫天干;子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥等十二个符号叫地支。
为了方便程序的书写,我们不妨将天干记做1到10,地支记做1到12。
通过查阅日历,Cwbc知道农历2018年是戊戌年,XHRlyb想知道农历的n年是什么年。
0年指1年的前一年。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述:

输入数据有多组数据,每行有一个整数,表示n。

输出描述:

输出数据应有多行,每行两个整数,分别表示天干和地支的编号。
示例1

输入

2018

输出

5 11
示例2

输入

2020

输出

7 1

备注:

n ∈ [0, 1018]。
1 ≤ T ≤ 1000。
思路:数学题;水题;只要计算出从哪里开始循环就可以了; 要用  long long ;
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long n;
 4 int main(){
 5     while(~scanf("%lld",&n)){
 6         if(n==0){
 7             printf("7 9\n");            
 8         }
 9         else if(n==1){
10             printf("8 10\n");
11         }
12         else if(n==2){
13             printf("9 11\n");
14         }
15         else if(n==3){
16             printf("10 12\n");
17         }
18         else{
19             long long t1=(n-4)%(long long)10;
20             t1++;
21             long long t2=(n-4)%(long long)12;
22             t2++;
23             printf("%lld %lld\n",t1,t2);
24         }
25     }
26 }
 
    

链接:https://www.nowcoder.com/acm/contest/87/I
来源:牛客网

排名
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld

题目描述

Cwbc和XHRlyb都参加了SDOI2018,他们特别关心自己的排名。
我们定义每一场比赛每位选手的 标准分它的分数乘以满分再除以比赛中选手所获得的最高分
NOIP2017的满分为600分,SDOI2018每一天的比赛满分均为300分。
我们定义 总分为NOIP2017的 标准分的25%,加上SDOI2018 前两天 标准分之和的25%,再加上SDOI2018后两天 标准分之和的50%。
XHRlyb告诉你每一次比赛每个选手的分数,你需要按照名次 从高到低依次输出他们的名字和总分。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述:

输入数据有多组数据,对于每组数据,格式为:
第一行,一个整数n,表示选手数量。
接下来n行,每一行有用空格隔开的一个字符串和五个整数,分别表示选手姓名、NOIP2017成绩以及SDOI2018四天比赛的成绩。

输出描述:

输出数据应有多组,每组输出有多行,每行应有一个选手姓名和他的总分。
输出的总分应保留5位小数,且如果总分的误差不超过10
-5
,我们认为两名选手并列。
若两名选手并列,则按姓名的字典序顺序从小到大输出。
示例1

输入

7
tzt 570 290 155 300 295
tyc 570 260 225 295 300
rqy 540 275 110 290 290
cz 520 260 130 285 290
hly 490 185 155 290 285
zhx 510 220 110 285 285
dzm 510 185 85 280 280

输出

tyc 589.74138
tzt 574.16667
rqy 539.89262
cz 534.91682
hly 515.95886
zhx 512.77374
dzm 490.38869

备注:

保证姓名均为小写字母且个数在[2,10]之间,每次比赛的分数不会超过满分也不会低于0分。
保证选手总数不会超过2 ∗ 105
1 ≤ T ≤ 5。
思路:水题,这题题目出的不是很好,坑了我好久;最高分是指每一次比赛所有选手的最高分,比如,SDOI2018第一天比赛的最高分是当天所有人的最高分;
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const double jingdu=1e-5;
 4 struct p{
 5     char name[20];
 6     double a,b,c,d,e;
 7     double zong;
 8     p(){
 9         memset(name,0,sizeof(name));
10         a=b=c=d=e=zong=0; 
11     } 
12 }s[200005];
13 bool cmp(p x,p y);
14 int main(){
15     int n;
16     while(~scanf("%d",&n)){    
17         memset(s,0,sizeof(s)); 
18         double ma_a=0,ma_b=0,ma_c=0,ma_d=0,ma_e=0;
19         for(int i=0;i<n;i++){
20             scanf("%s%lf%lf%lf%lf%lf",s[i].name,&s[i].a,&s[i].b,&s[i].c,&s[i].d,&s[i].e);
21             ma_a=max(s[i].a,ma_a);
22             ma_b=max(s[i].b,ma_b);
23             ma_c=max(s[i].c,ma_c);
24             ma_d=max(s[i].d,ma_d);
25             ma_e=max(s[i].e,ma_e);
26         }
27         for(int i=0;i<n;i++){
28             s[i].a=s[i].a*600/ma_a;
29             s[i].b=s[i].b*300/ma_b;
30             s[i].c=s[i].c*300/ma_c;
31             s[i].d=s[i].d*300/ma_d;
32             s[i].e=s[i].e*300/ma_e;
33             s[i].zong=s[i].a*0.25+(s[i].b+s[i].c)*0.25+(s[i].d+s[i].e)*0.5;
34         }
35         sort(s,s+n,cmp);
36         for(int i=0;i<n;i++){
37             printf("%s %.5lf\n",s[i].name,s[i].zong);
38         }
39     }
40 }
41 bool cmp(p x,p y){
42     if(fabs(x.zong-y.zong)>jingdu){
43         return x.zong>y.zong;
44     }
45     else{
46         if(strcmp(x.name,y.name)>0)
47             return false;
48         return true;
49     }
50 }
 
   

猜你喜欢

转载自www.cnblogs.com/dahaihaohan/p/9032938.html