江西财经大学第一届程序设计竞赛

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

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

题目描述

"挤需体验五番钟,里造会挨上这款游戏!"
怎么可能嘛!当我是傻子吗!#?%!“”@……
于是我就去玩了,然后我果然成功证明,我是正确的,这破游戏,真的很无聊.
有多无聊呢,和这道题一样.
------------------------------------
问题有两种情况
0 给出两个100以内的正整数做加法
1 给出一个字符串问有多少个字符(字符串长度不超过100000)

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例先输入一个整数N(0或者1)
若N为0,则输入两个整数a,b(0<=a,b<=100)
若N为1,则输入一个字符串s

输出描述:

输出T行
每行输出一个样例对应的结果
示例1

输入

2
0 1 1
1 aa

输出

2
2

签到题,就不多说了。
 1 #include <iostream>
 2 #include <string>
 3  
 4 using namespace std;
 5  
 6 int main(){
 7     int n;
 8     cin>>n;
 9     while(n--){
10         int m;
11         cin>>m;
12         if(m==0){
13             int x,y;
14             cin>>x>>y;
15             cout<<x+y<<endl;
16         }else{
17             string s;
18             cin>>s;
19             cout<<s.length()<<endl;
20         }
21     }
22  
23     return 0;
24 }

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

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

题目描述

给出一个出生日期,比如:1999-09-09,
问:从出生那一天开始起,到今天2018-04-21为止(包括出生日期和今天),有多少天,年月日都不包含数字4?

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每个样例一行,包含一个字符串“yyyy-mm-dd”(1990<=yyyy<=2018)
题目保证测试数据的正确性

输出描述:

输出题意要求的天数
示例1

输入

1
1999-09-09

输出

5020

这道题,做起来其实并不难,要的是细心,要不然会出现各种bug。
所以这题三层for就可以解决,只是条件一定要想好。
不然条理不清晰,就很难做。

 1 #include <iostream>
 2  
 3 using namespace std;
 4  
 5 int vis[29]={365,365,366,365,365,365,366,365,365,365,366,365,365,365,366,365,365,365,366,365,365,365,366,365,365,365,366,365,365};
 6 int month1[12]={31,29,31,30,31,30,31,31,30,31,30,31};
 7 int month2[12]={31,28,31,30,31,30,31,31,30,31,30,31};
 8 int n;
 9 int main(){
10     cin>>n;
11     while(n--){
12         int sum =0,ans = 0,cnt=0;
13         int x,y,z;
14         char a,b;
15         cin>>x>>a>>y>>b>>z;
16         for(int i=x;i<=2018;i++){
17             if(i%10==4)
18                 continue;
19             bool prime = false;
20             if(vis[i-1990]==366){
21                 prime = true;
22             }
23             for(int j=(i==x?y:1);j<=(i==2018?4:12);j++){
24                 if(j==4) continue;
25                 for(int k=(i==x&&j==y?z:1);k<=(prime?month1[j-1]:month2[j-1]);k++){
26                     if(k==4||k==14||k==24){
27                         continue;
28                     }else{
29                         sum++;
30                     }
31                 }
32             }
33         }
34         cout<<sum<<endl;
35     }
36     return 0;
37 }

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

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

题目描述

决赛圈还剩下两个人,“伏地魔”XDD和跑毒进圈的FZL,XDD拿着狙击枪AWM瞄准并准备射击奔跑中的FZL。
XDD知道自己只有这一次机会,如果失误了,他就会被大哥FZL空中360度甩狙一枪带走。
那么XDD能吃鸡吗,请你帮助他。
-------------------------------------------
为了便于分析,子弹,XDD,FZL都假设为原点,子弹水平射出,FZL在奔跑过程中与XDD的距离不变。
子弹下坠的加速度为9.8米每秒。
给出 XDD和FZL的距离 浮点数 L 、子弹的速度 浮点数V1、FZL奔跑的速度浮点数 V2
XDD需要知道从射击到击中目标这段时间内 子弹下坠的距离 L1和 FZL跑动的距离L2,从而预判射击的位置,请你帮他计算。

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每个样例一行,包括三个浮点数 L V1 V2(0<L,V1,V2<=10000)

输出描述:

输出T行
每个测试用例输出一行对应的结果
L1 L2(一个空格隔开,结果保留6位小数)
示例1

输入

1
100 1000 10

输出

0.049000 1.000000

这就纯粹是个物理题目了,先求出时间,然后就都出来了,
就是注意精度问题就行。

 1 #include <iostream>
 2 using namespace std;
 3 int T;
 4 int main(){
 5     cin>>T;
 6     while(T--){
 7         double L,v1,v2;
 8         cin>>L>>v1>>v2;
 9         double t = L/v1;
10         double x = 0.5*9.8*t*t;
11         double XX = v2*t;
12         printf("%.6f %.6f
",x,XX);
13     }
14     return 0;
15 }

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

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

题目描述

事情,是这样的。
有这么一天双休日的中午。
我刚把我衣服扔进了洗衣机,然后拿了个小板凳坐在旁边发呆。
然后突然想到这么无聊干脆玩会阴阳师好了,于是从斗篷帽子里掏出我的手机登录了阴阳师。
看着更新公告里写着的新SSR式神一目连感叹了一下:我要是能有个一目连该多好啊
看了一眼我家帅气的扛把子咕咕,正准备肝困难的时候发现庭院里那一串灯笼里的调查问卷有蝴蝶在绕,于是点进去填了一波在最结尾写上了我当时的愿望:我想要一目连。
然后奖励了一个符,顺手就抽了。本来以为又是R卡,没想到手机震动了一下。
握草!!!一目连!!!!
当时我就激动的站了起来使劲看了一眼然后仰天大笑以及截图装逼。
---------------------------------------------------------------------------------------
SSR全称为superior super rare,特级超稀有。一般为卡牌类游戏最高稀有等级。
 
题目是给出三个字符,求其升级到SSR所需要的次数。
最小为AAA,最大为SSR;
SSQ升级到SSR需要升级1次,
SRR升级到SSR需要升级19次。

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每个样例一行,包含三个连续的大写字母(A - S)

输出描述:

每个样例输出一行
升级到SSR所需的次数
示例1

输入

3
SSR
SRR
AAA

输出

0
19
6857

备注:

SRR升级到SSR的过程:
SRR -> SRS -> SSA ->SSB -> SSC -> ……->SSR 共19次

这就相当于十九进制的转换,最高只有S,然后把两个字符串转化成十进制的数,
在求差就行了。

 1 #include <iostream>
 2 #include <string>
 3  
 4 using namespace std;
 5  
 6 int main(){
 7     int n;
 8     cin>>n;
 9     while(n--){
10         char a,b,c;
11         cin>>a>>b>>c;
12         int x = 'S'-a;
13         int y = 'S'-b;
14         int z = 'R'-c;
15         if(z<0){
16             y--;
17             z+=19;
18         }
19         if(y<0){
20             x--;
21             y+=19;
22         }
23         int sum = x*19*19+y*19+z;
24         cout<<sum<<endl;
25     }
26     return 0;
27 }

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

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

题目描述

当你的好友给你发来一条消息,你的消息列表上就会置顶显示该好友的名字以及该好友发给你的消息总数,换句话说,你的消息列表里的好友是按跟你发消息的时间进行排序的,给你发消息的时间离当前时间越近的好友将排到越前面。当然,你可能会手动置顶一些好友,那么其他的好友给你发消息时,他们的名字就只能在你手动置顶好友的后面再置顶了。如果消息被你查看或者忽略,又或者你把好友消息删除了,消息总数将重置为0。

根据用户的需求,有以下几个功能,需要你来实现:
(1)recv:收到一条好友消息,对于手动置顶好友的消息,将在“手动置顶好友列表”里置顶;对于其他好友的消息,将在“手动置顶好友列表”之下的消息列表里置顶,同时都需要显示该好友的消息总数。
(2)view:查看好友消息,将使该好友消息数变为0。
(3)up:手动置顶好友。
(4)down:取消手动置顶。
(5)delete:删除好友消息,这个操作将使该好友从消息列表中删除,同时取消对该好友的手动置顶(如果存在的话)。

假设初始消息列表为空,经过了一系列好友消息的操作之后,最终的消息列表将是怎么样的呢?

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例。
每组样例
第一行输入一个整数M,表示操作数(1≤M≤1000000);
接下来M行,
每行输入一个操作,由一个操作类型和一个好友id构成,之间以空格分开,操作类型如上面5个英文单词表示,
例如:“recv 123456”表示接收到id为123456的好友的一条消息,“delete 123456”表示在消息列表中删除 id 为123456的好友的消息记录。
为了简化问题,一开始消息列表为空并假设好友名字id由六位数字“唯一”标识(000000≤id≤999999),
题目保证输入数据的一致性。

输出描述:

每组样例,
输出最后的消息列表,自顶向下,每行输出一个:“好友id 消息数”。
每组样例后空一行。
示例1

输入

1
13
recv 000001
recv 000002
up 000002
view 000001
recv 000002
recv 000004
up 000004
up 000001
recv 000004
recv 000003
view 000001
view 000004
down 000002

输出

000004 0
000001 0
000003 1
000002 2

我本身感觉这题不难,但是比赛的时候看都没看这题,
以为很少人过就没看,结果补题的时候才发现,其实挺简单的。
就是判断好条件,剩下的用个结构体就行,然后加个CMP sort排序,
因为内存没那么大,所以可以选择直接用10000000的内存,或者自己自动分配,
我选择自动分配内存。

 1 #include <bits/stdc++.h>
 2 #define N 1000009
 3 #define mem(a) memset(a,0,sizeof(a))
 4 using namespace std;
 5 struct Node{
 6     int index;
 7     int top;
 8     int mess;
 9     int uup;
10     bool is;
11 };
12 Node node[N];
13 bool cmp(Node a,Node b){
14     if(a.top==b.top){
15         return a.uup>b.uup;
16     }
17     return a.top>b.top;
18 }
19 int vis[N];
20 int t,n;
21 int main(){
22     cin>>t;
23     while(t--){
24         mem(node);
25         memset(vis,-1,sizeof(vis));
26         cin>>n;
27         int j=0;
28         for(int i=1;i<=n;i++){
29             string s;
30             int m;
31             cin>>s>>m;
32             if(s=="recv"){
33                 if(vis[m]>=0){
34                     node[vis[m]].mess++;
35                     node[vis[m]].uup = i;
36                 }else{
37                     node[j].index = m;
38                     node[j].uup = i;
39                     node[j].mess++;
40                     node[j].top = 0;
41                     node[j].is = true;
42                     vis[m] = j;
43                     j++;
44                 }
45             }else if(s=="view"){
46                 node[vis[m]].mess = 0;
47             }else if(s=="up"){
48                 node[vis[m]].top = 1;
49             }else if(s=="down"){
50                 node[vis[m]].top = 0;
51             }else{
52                 node[vis[m]].top = 0;
53                 node[vis[m]].mess = 0;
54                 node[vis[m]].uup = 0;
55                 node[vis[m]].is = false;
56                 vis[m] = -1;
57             }
58         }
59         sort(node,node+j,cmp);
60         for(int i=0;i<j;i++){
61             if(node[i].is){
62                 printf("%06d ",node[i].index);
63                 printf("%d
",node[i].mess);
64             }
65         }
66         cout<<endl;
67     }
68     return 0;
69 }

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

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

题目描述

对于方程 2018 * x ^ 4 + 21 * x + 5 * x ^ 3 + 5 * x ^ 2 + 14 = Y,
告诉你Y的值,你能找出方程在0~100之间的解吗?

输入描述:

第一行输入一个正整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个实数Y

输出描述:

一行输出一个样例对应的结果,
输出方程在0~100之间的解,保留小数点后4位小数;如果不存在,输出 -1
示例1

输入

2
1
20180421

输出

-1
9.9993


这题其实一开始我想用二分做,但是我感觉精度为0.0001有点小,怕等下出bug就尴尬了,所以就
先在100个整数中找到了是不是在哪两个整数之间,然后再细分,也就100*1000,所以不会超时。

 1 #include <iostream>
 2 #define Max (double)201805052114
 3 using namespace std;
 4  
 5 double mat(double x){
 6     return 2018.00*x*x*x*x+21.0*x+5.0*x*x*x+5.0*x*x+14.0;
 7 }
 8 int main(){
 9     int t;
10     cin>>t;
11     while(t--){
12         double n;
13         cin>>n;
14         if(n>Max||n<14){
15             cout<<"-1"<<endl;
16         }else{
17             bool prime = false;
18             for(double i=0;i<=100;i++){
19                 if(mat(i)>n){
20                     for(double k=i-1;k<i;k+=0.0001){
21                         if(mat(k)>n){
22                             double a=k-0.0001;
23                             if(n-mat(a)>mat(k)-n)
24                                 printf("%.4f
",k);
25                             else
26                                 printf("%.4f
",a);
27  
28                             prime = true;
29                             break;
30                         }
31                     }
32                 }else if(mat(i)==n){
33                     printf("%.4f
",i);
34                     prime = true;
35                 }
36                 if(prime)
37                     break;
38             }
39         }
40  
41  
42  
43     }
44  
45     return 0;
46 }

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

小Q的口袋校园
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

周末,小Q喜欢在PU口袋校园上参加各种活动刷绩点,体验丰富多彩的大学生活。
但是每个活动有各自的开始时间、结束时间、Happy值以及绩点数,活动之间可能存在时间冲突。
小Q是一个认真踏实的女孩,她在同一时间只会参加一个活动。
给出每一天的活动数,求小Q在同一天内所能获得的最大Happy值 与 绩点数。
小Q是一个活泼开朗的女孩,她总是寻求最大的Happy值,如果Happy值相同,才会尽可能使绩点数更多。

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例第一行输入一个整数N(表示有几项活动)
接下来N行,每行输入s,e,h,p 4个整数,分别代表一个活动的开始时间、结束时间、Happy值以及绩点数
0<=s<e<=24,1<=h,p<=100,1<=T,N<=20

输出描述:

输出T行
一行输出一个样例对应的结果
小Q在一天内所能获得的最大 Happy值 与 绩点数
示例1

输入

1
4
1 3 1 1
2 5 2 1
3 7 2 1
5 8 1 2

输出

3 3

说明

有两种方案
1)选择 第1、3两个活动,可以获得 Happy值 3 和 绩点数 2;
2)选择 第2、4两个活动,可以获得 Happy值 3 和 绩点数 3.


这题就是一路贪心,从开始时间最早的开始往后面走,

然后判断幸福值,幸福值相同的时候,就判断绩点值。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #define mem(a) memset(a,0,sizeof(a))
 5 using namespace std;
 6  
 7 struct Node{
 8     int st,en,ha,point;
 9 };
10 Node node[30];
11 bool cmp(Node a, Node b){
12     return a.st<b.st;
13 }
14 int happy[25],points[25];
15 int main(){
16     int t;
17     cin>>t;
18     while(t--){
19         mem(happy);
20         mem(points);
21         int n;
22         cin>>n;
23         for(int i=0;i<n;i++){
24             cin>>node[i].st>>node[i].en>>node[i].ha>>node[i].point;
25         }
26         sort(node,node+n,cmp);
27         for(int i=0;i<n;i++){
28             for(int j=node[i].en;j<=24;j++){
29                 if(happy[j]<happy[node[i].st]+node[i].ha){
30                     happy[j] = happy[node[i].st]+node[i].ha;
31                     points[j] = points[node[i].st]+node[i].point;
32                 }else if(happy[j]==happy[node[i].st]+node[i].ha){
33                     points[j]=max(points[j],points[node[i].st]+node[i].point);
34                 }
35             }
36         }
37         cout<<happy[24]<<" "<<points[24]<<endl;
38     }
39     return 0;
40 }
 

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

小P的数学问题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活。
他总是能从所学的知识散发出奇妙的思维。
今天他想到了一个简单的阶乘问题,
0!= 1
1!= 1
2!= 1 * 2 = 2
3!= 1 * 2 * 3 = 6
4!= 1 * 2 * 3 *4 = 24
5!= 1 * 2 * 3 *4 * 5 = 120
如果 n=1000000000,那么n的阶乘会是多少呢,小P当然知道啦,那么你知道吗?

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个整数N(0<=N<=1000000000)

输出描述:

输出T行
每一行输出N的阶乘 N!(由于这个数比较大,所以只要输出其对1000000007取膜的结果即可)
示例1

输入

2
0
1000000000

输出

1
698611116


这里用到的是分块打表,要不然肯定超限。
 1 #include <iostream>
 2 #include <vector>
 3 #define mod 1000000007
 4 #define ll long long int
 5 using namespace std;
 6 int T;
 7 ll a[110]={1,682498929,491101308,76479948,723816384,67347853,27368307,
 8 625544428,199888908,888050723,927880474,281863274,661224977,623534362,
 9 970055531,261384175,195888993,66404266,547665832,109838563,933245637,
10 724691727,368925948,268838846,136026497,112390913,135498044,217544623,
11 419363534,500780548,668123525,128487469,30977140,522049725,309058615,
12 386027524,189239124,148528617,940567523,917084264,429277690,996164327,
13 358655417,568392357,780072518,462639908,275105629,909210595,99199382,
14 703397904,733333339,97830135,608823837,256141983,141827977,696628828,
15 637939935,811575797,848924691,131772368,724464507,272814771,326159309,
16 456152084,903466878,92255682,769795511,373745190,606241871,825871994,
17 957939114,435887178,852304035,663307737,375297772,217598709,624148346,
18 671734977,624500515,748510389,203191898,423951674,629786193,672850561,
19 814362881,823845496,116667533,256473217,627655552,245795606,586445753,
20 172114298,193781724,778983779,83868974,315103615,965785236,492741665,
21 377329025,847549272,698611116};
22 int main(){
23     cin>>T;
24     while(T--){
25         ll x;
26         cin>>x;
27         ll w=x/10000000;
28         ll ans = a[w];
29         for(int i=w*10000000+1;i<=x;i++)
30             ans=(ans*i)%mod;
31         cout<<ans%mod<<endl;
32     }
33     return 0;
34 }

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

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

题目描述

小P和小Q是好朋友,今天他们一起玩一个有趣的游戏。
他们的初始积分都为1,赢的人可以将自己的分数乘以 (K的平方),而输的人也能乘以K。
他们玩的太开心了,以至于忘了自己玩了多久,甚至 K 是多少和游戏进行的回合数 N 都忘了。
现在给出他们俩最终的积分a,b,请问是否存在正整数K、N满足这样的积分,判断他们的游戏结果是否可信。

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每组样例一行,输入两个正整数a,b(0<a,b<=1e9)

输出描述:

输出T行
一行输出一个样例对应的结果
若结果可信,输出 Yes
否则,输出 No
示例1

输入

6
2 4
75 45
8 8
16 16
247 994
1000000000 1000000

输出

Yes
Yes
Yes
No
No
Yes

备注:

每回合的K可能不同


这里一开始完全没有思路,之后发现可以同时开三次方,然后判断是否是整数来判断。
但是我个人觉得还是有问题的,
比如 1 8;
开三次方是可以达到2,但是好像完全达不到1 8这个时候。

 1 #include <bits/stdc++.h>
 2 #define ll long long int
 3 using namespace std;
 4  
 5 int main(){
 6     int t;
 7     cin>>t;
 8     while(t--){
 9         ll a,b;
10         cin>>a>>b;
11         ll sum = a*b;
12         float ans = pow(sum,1/3.0);
13         if(ans==(int)ans){
14             cout<<"Yes"<<endl;
15         }else{
16             cout<<"No"<<endl;
17         }
18     }
19  
20  
21     return 0;
22 }
原文地址:https://www.cnblogs.com/zllwxm123/p/8904269.html