zoukankan      html  css  js  c++  java
  • 河南理工大学第六届程序设计大赛

    问题 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
    ",dp[yy][dd]-1);
    		else printf("%d
    ",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
    ",x,y);
    	while(p*k<x)p++;
    	ans=0;
    		while(p*k<=y)ans++,p++;
    		printf("%lld
    ",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
    ",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
    ",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
    ",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
    ",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;
    }
    

      

  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5005665.html
Copyright © 2011-2022 走看看