问题 A: 感恩节KK专场——送给新生的礼物
时间限制: 1 Sec 内存限制: 128 MB 提交: 633 解决: 189 [提交][状态][讨论版]
题目描述
学长KK要送给学弟学妹们礼物,他送给学弟每人一个礼物,送给学妹每人两个礼物。为什么?KK单身好多年了。 现在KK想知道他需要准备的礼物数目。注意:如果没有学妹,KK会十分伤心,就不会给任何人发礼物。
输入
给定一个整数t,表示有t(t<=30)组测试数据。每组测试数据有两个整数b(0<=b<=100)和g(0<=g<=100),表示学弟的人数和学妹的人数。
输出
每行输出一个整数,表示需要准备的礼物数。
样例输入
2 1 2 2 3
样例输出
5 8
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #define mem(x,y) memset(x,y,sizeof(x)) #define T_T while(T--) typedef long long LL; #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") using namespace std; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); int main(){ int T,b,g; SI(T); T_T{ SI(b);SI(g); if(g==0){ puts("0");continue; } PI(b+g*2);puts(""); } return 0; }
问题 B: 感恩节KK专场——特殊的比赛日期
时间限制: 1 Sec 内存限制: 128 MB 提交: 393 解决: 100 [提交][状态][讨论版]
题目描述
KK今天参加河南理工大学ACM程序设计竞赛,他发现今天是11月29号,刚好11和29都是素数(只能被1和自己本身整除的数叫做素数),于是他想知道今年(2015年)的某天之前(不含当天)一共有多少天是月份和天数都是素数。
输入
第一行输入一个整数t(1<t<366),代表t组测试数据。
接下来每行输入一个日期,仅包含(月份和天数),格式形如(yy-dd)。
输入时保证日期全部属于合法日期。
输出
输入yy-dd天之前有多少天的日期同时满足yy和dd同时为素数。
样例输入
3 2-2 2-5 2-15
样例输出
0 2 6
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #define mem(x,y) memset(x,y,sizeof(x)) #define T_T while(T--) typedef long long LL; #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") using namespace std; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); int dp[13][32]; int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; bool prime(int x){ if(x==0||x==1)return false; if(x==2)return true; for(int i=2;i<x;i++){ if(x%i==0)return false; } return true; } int main(){ int T,yy,dd; mem(dp,0); for(int i=2;i<=12;i++){ dp[i][1]=dp[i-1][mon[i-1]]; if(prime(i)){ for(int j=2;j<=mon[i];j++){ dp[i][j]=dp[i][j-1]; if(prime(j))dp[i][j]++; // printf("%d ",dp[i][j]); } } else { int temp=dp[i-1][mon[i-1]]; for(int j=2;j<=mon[i];j++){ dp[i][j]=temp; } } } scanf("%d",&T); T_T{ scanf("%d-%d",&yy,&dd); if(prime(yy)&&prime(dd))printf("%d\n",dp[yy][dd]-1); else printf("%d\n",dp[yy][dd]); } return 0; }
问题 C: 感恩节KK专场——考试来了
时间限制: 1 Sec 内存限制: 128 MB 提交: 479 解决: 115 [提交][状态][讨论版]
题目描述
很多课程马上就结课了,随之而来的就是可怕的考试啦。现在KK学长即将迎来n场考试,为了不挂科,他必须复习完这n门课程。但是KK学长比较贪玩,一天只会花费a时间和b精力去复习。已知距离考试还有d天,问KK学长能不能复习完所有的功课。
输入
给定一个整数t,表示有t(t<=50)组测试数据。每组测试数据第一行有一个整数n(1<=n<=100),表示课程数目。 接下来一行有三个整数a,b,d(0<=a,b,d<=1000),代表上面提到的信息。下面有n行,每行有两个整数T[i],E[i](0<=T[i],E[i]<=1000),表示KK学长复习第i门课程,需要花费时间T[i],消耗精力E[i]。
输出
若KK学长可以复习完所有的课程,输出YES,否则输出NO。输出占一行。
样例输入
1 5 2 3 4 1 1 1 1 1 1 1 1 1 1
样例输出
YES
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #define mem(x,y) memset(x,y,sizeof(x)) #define T_T while(T--) typedef long long LL; #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") using namespace std; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); int main(){ int T,a,b,d,n,t,e,st,se; SI(T); T_T{ SI(n); scanf("%d%d%d",&a,&b,&d); st=0;se=0;int i; for(i=0;i<n;i++){ SI(t);SI(e); st+=t;se+=e; } if(a*d>=st&&b*d>=se)puts("YES"); else puts("NO"); } return 0; }
问题 D: 感恩节KK专场——2015年的第一场雪
时间限制: 1 Sec 内存限制: 128 MB 提交: 873 解决: 77 [提交][状态][讨论版]
题目描述
下雪了,KK学长站在三教门口,看学弟学妹们堆雪人。突然KK学长发现一个神奇的规律:春秋大道上能被k整除的位置都会有一个雪人。现在KK学长想知道春秋大道的[x, y]区间里面有多少个雪人。
输入
给定一个整数t,表示有t(t<=6000)组测试数据。每组测试数据有三个整数k(k非0且|k|<=2^30),x,y(x<=y且|x|,|y|<=2^30)。
输出
每行输出一个整数,表示雪人的个数。
样例输入
1 1 1 2
样例输出
2
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #define mem(x,y) memset(x,y,sizeof(x)) #define T_T while(T--) typedef long long LL; #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") using namespace std; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); int main(){ int k,x,y,T; LL ans; SI(T); T_T{ scanf("%d%d%d",&k,&x,&y); int p=x/k; // printf("%d %d\n",x,y); while(p*k<x)p++; ans=0; while(p*k<=y)ans++,p++; printf("%lld\n",ans); } return 0; }
问题 E: 感恩节KK专场——爬楼梯
时间限制: 1 Sec 内存限制: 1000 MB 提交: 385 解决: 91 [提交][状态][讨论版]
题目描述
来机房比赛的时候大家都会爬楼梯,但是每个人可以迈出的最大步子不一样,所以到达机房的方案数也会不同。现在KK提出一个问题:目的地在第n层楼梯,我们在第1层,已知我们每次最多可以迈出3个台阶。问有多少种方案可以到达目的地。
输入
给定一个整数t,表示有t组测试数据(t>=10000)。每组测试数据有一个整数n(1<=n<=30),代表有n阶楼梯。
输出
每行输出一个整数,表示方案数。
样例输入
3 1 2 3
样例输出
0 1 2
注意dp[4]=1+2+1;
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #define mem(x,y) memset(x,y,sizeof(x)) #define T_T while(T--) typedef long long LL; #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") using namespace std; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); LL dp[40]; int main(){ mem(dp,0); int T; dp[1]=0;dp[2]=1;dp[3]=2;dp[4]=4; for(int i=5;i<=30;i++)dp[i]=dp[i-1]+dp[i-2]+dp[i-3]; int n; SI(T); T_T{ SI(n); printf("%lld\n",dp[n]); } return 0; }
问题 F: 感恩节KK专场——面试难题
时间限制: 1 Sec 内存限制: 128 MB 提交: 297 解决: 40 [提交][状态][讨论版]
题目描述
有n个人要来面试学生会XX部门,要求面试过程中任意两个面试者之间的时间不能有重叠。已知n个面试者到来的时间和需要面试的时间,问最多可以面试多少个人。该部门的XX是KK的好友,现在他来找KK帮忙。但是KK很忙,请你帮帮KK吧。 时间重叠如[1, 3] [2, 4]或者[1, 3][3, 4]。
输入
给定一个整数t,表示有t(t<=100)组测试数据。每组测试数据有一个整数n(0<=n<=1000),接下来每行有两个整数S[i],T[i],表示第i个面试到来的时间和需要面试的时间。
输出
每行输出一个整数,表示最多可以面试的人数。
样例输入
1 1 1 0
样例输出
1
题解:贪心
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #define mem(x,y) memset(x,y,sizeof(x)) #define T_T while(T--) typedef long long LL; #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") using namespace std; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); struct Node{ int s,l; }dt[1010]; int cmp(Node a,Node b){ if(a.s+a.l!=b.s+b.l)return a.s+a.l<b.s+b.l; else return a.s<b.s; } int main(){ int T,n; SI(T); T_T{ SI(n); if(n==0){ puts("0");continue; } for(int i=0;i<n;i++){ Node a; scanf("%d%d",&a.s,&a.l); dt[i]=a; } sort(dt,dt+n,cmp); int ans=1,cur=dt[0].s+dt[0].l; for(int i=1;i<n;i++){ if(cur<dt[i].s){ ans++; cur=dt[i].s+dt[i].l; } } printf("%d\n",ans); } return 0; }
问题 G: 感恩节KK专场——与学妹滑雪
时间限制: 1 Sec 内存限制: 128 MB 提交: 301 解决: 26 [提交][状态][讨论版]
题目描述
这周下的雪好大好大,不过这正和KK学长之意。因为他要去陪学妹滑雪,谁知调皮的学妹要和KK比赛,无奈的KK只能应战。已知比赛场地有n个站点,m条路线。比赛起点是第一个站点,终点是第n个站点,先到达终点的人是胜者(如果KK和学妹同时到,KK会认输)。现在KK为了显示学长风范,决定让学妹先滑T秒。但是到了比赛的时候,KK就有点后悔了。已知学妹到达终点需要时间Tg秒,KK每秒可以滑k米。现在问你KK在最优情况下能否赢得比赛。
输入
给定一个整数t,表示有t(t<=20)组测试数据。每组测试数据有两个整数n(1<=n<=1000),m(1<=m<=10000),接下来m行表示路线,每行三个整数a,b,c分别表示路线起点,终点,长度。最后一行有两个个整数T(1<=T<=10),Tg(1<=Tg<=10000)和一个实数k(0<=k<=200)表示上面提到的信息。
输出
若KK可以获胜输出"Good job,KK!",否则输出"What a pity!"。输出占一行。
样例输入
1 2 1 1 2 3 1 1 1
样例输出
What a pity!
最短路,注意精度;
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #define mem(x,y) memset(x,y,sizeof(x)) #define T_T while(T--) typedef long long LL; #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") using namespace std; const int MAXN=1010; const int INF=0x3f3f3f3f; int mp[MAXN][MAXN]; int vis[MAXN],dis[MAXN]; int n,m; void dij(int u){ mem(vis,0);mem(dis,INF); dis[u]=0; while(true){ int k=-1,temp=INF; for(int i=1;i<=n;i++) if(!vis[i]&&(k==-1||dis[i]<dis[k]))k=i; if(k==-1)break; vis[k]=1; for(int i=1;i<=n;i++) if(!vis[i]&&dis[i]>dis[k]+mp[k][i])dis[i]=dis[k]+mp[k][i]; } } int main(){ int T,a,b,c,st,tg; double k; SI(T); T_T{ mem(mp,INF); scanf("%d%d",&n,&m); while(m--){ scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c)mp[a][b]=mp[b][a]=c; } dij(1); scanf("%d%d%lf",&st,&tg,&k); // printf("%d\n",dis[n]); if(1.0*tg-(st+1.0*dis[n]/k)<1e-3)puts("What a pity!"); else puts("Good job,KK!"); } return 0; }
1723: 感恩节KK专场——陪学妹上课
时间限制: 1 Sec 内存限制: 128 MB 提交: 47 解决: 22 [提交][状态][讨论版]
题目描述
KK和学妹一起去上线性代数课,号称“数学小王子”的KK,听数学课就犯困,为了使KK不睡觉,学妹决定给KK玩一个游戏,来激发KK。
游戏是这样的:给出一个N*N的矩阵,矩阵中分别填入1--N*N个数字,不允许重复,使得矩阵中每行、每列以及每条对角线上的数字之和,全部相等。
为了降低难度,学妹告诉KK,每组测试数据的第一行的正中间的数字一定为1。数据保证N为奇数。
输入
给定一个整数t(0<t<1000),表示有t组测试数据。
每组测试数据有一个奇数N(0<N<200),表示填上N*N个数字。
输出
每组测试数据输出一个N*N的矩阵,每个数字占8位,右对齐,具体格式见输出样例。
样例输入
2 3 5
样例输出
8 1 6 3 5 7 4 9 2 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
题解:神奇的规律。。。。每次向右上跑,如果右上有数,就往下跑,再往右上跑。。。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #define mem(x,y) memset(x,y,sizeof(x)) #define T_T while(T--) typedef long long LL; #define SI(x) scanf("%d",&x) #define SL(x) scanf("%lld",&x) #define PI(x) printf("%d",x) #define PL(x) printf("%lld",x) #define P_ printf(" ") using namespace std; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); const int MAXN=210; int dp[MAXN][MAXN]; int main(){ int T,N; SI(T); T_T{ SI(N); if(N==1){ printf("%8d\n",1);continue; } mem(dp,0); int r=1,l=(1+N)>>1,sl,sr; dp[r][l]=1; int i=1; while(1){ sl=l;sr=r; r=(r-1+N)%N; if(!r)r=N; l=(l+1)%N; if(!l)l=N; if(dp[r][l])l=sl,r=sr,r=(r+1)%N; if(!r)r=N; dp[r][l]=++i; if(i==N*N)break; } for(i=1;i<=N;i++){ for(int j=1;j<=N;j++){ printf("%8d",dp[i][j]); } puts(""); } } return 0; }