标签:
Problem A:
题意:ZCC在玩一个游戏, 在这个游戏中他有一个技能,可以把一张牌变成他想要的样子. 现在给出5张牌,问ZCC至少需要多少次可以把5张牌变成同花顺. (A,B,C,D分别表示4种花色的牌,每种花色有1,2,3,4....13), 同花顺首先花色必须相同,然后花色后面的数字必须依次递增
比如1,2,3,4,5 10,11,12,13,1 都被看成顺子,而11,12,13,1,2 则不是.
没什么技巧, 暴力枚举
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> #include<algorithm> #include<cmath> #include<iostream> using namespace std; typedef long long LL; #define oo 1000000007 #define mod 1000000007 #define maxn 205 int maps[maxn][maxn]; void get(char s[]) { int x = s[0]-‘A‘+1; int y = 0; for(int i = 1; s[i]; i++) y = y*10+s[i]-‘0‘; maps[x][y] = 1; } //maps[i][j](1<=i<=4 && 1<=j<=13) i表示花色 int main() { char s[maxn]; int T, i, j, n, ans, sum; scanf("%d", &T); while(T--) { ans = 100; n = 5; memset(maps, 0, sizeof(maps)); for(i = 1;i <= 5; i++) { scanf("%s", s); get(s); //标记该花色的牌 } for(i = 1; i<= 4; i++)//枚举花色 { for(j = 1; j <= 10; j++)//枚举顺子起始位置 { int t = j, cnt=0, sum=0; while(cnt < 5) { if(t > 13) t %= 13; if(maps[i][t]==0) sum++; cnt++; t++; } ans = min(ans, sum); } } printf("%d\n", ans); } return 0; }
Problem C:
硬币兑换,由递推的感觉.
首先考虑全部兑换成一种硬币的情况 1分的有1种 2分的有n/2种 3分的有n/3种, 然后考虑3种硬币混合的情况,枚举要兑换3分的个数相加即可. 如果兑换i(1<=i<=n/3)个3分的 那么就可以兑换2分的硬币(n-3*i)/2个,余下的补上一分的即可.
int i, n, ans, k; while(scanf("%d", &n) != EOF) { k = n/3; ans = 1+n/3+n/2;//全部由一种硬币组成的情况 for(i = 1; i <= k; i++)//有i个3分硬币,余下的兑换成2分的,不足的用一分的补齐. ans += (n-3*i)/2; printf("%d\n", ans); }
Problem D:
n个人坐成一圈,每个人手中有一定数量的糖果(糖果数量为偶数),现在做一个游戏,每当老师吹一次哨,左边的人把手中的糖的一半分给他右边的人, 如果某个人手中的糖果是奇数个的话,老师就再分给他一个糖果,
问经过多少次吹哨,所有人手中的糖果数量都相同.输出吹哨的次数,以及最后每个人手中的糖果的数量. 题目貌似没有太清晰的数据范围,不过这道题暴力可以过. 代码略丑,大家凑合着看吧
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> #include<algorithm> #include<cmath> #include<iostream> using namespace std; typedef long long LL; #define oo 1000000007 #define mod 1000000007 #define maxn 205 int candys[1005], n; int judge() { int i; for(i = 1; i < n; i++) if(candys[i] != candys[i-1]) return 0; return candys[0]; } int main() { int i, t, ans, s, last; while(scanf("%d", &n), n) { ans = s = 0; for(i=0; i < n; i++) scanf("%d", &candys[i]); while(!ans) { s++; last = candys[0]; for(i = 1; i < n; i++) { t = candys[i]; candys[i] = t/2 + last/2; if(candys[i]%2) candys[i]++; last = t; } candys[0] = candys[0]/2+last/2; if(candys[0]%2) candys[0]++; ans = judge(); if(ans != 0) break; } printf("%d %d\n", s, ans); } return 0; }
Problem E:
这道题就是本次题目的坑点所在了, 关于题意就是判断一个数是否在给定的区间之内, A掉本题是需要脑洞的, 也是佩服出题人 ,真心不容易,,,
题意就不过多描述了,详细看代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> #include<algorithm> #include<cmath> #include<iostream> using namespace std; typedef long long LL; #define oo 1000000007 #define mod 1000000007 #define maxn 205 char s[maxn]; int judge(int mark) {//mark 标记是否有 ‘-‘ 0表示没有,1表示有 int i =0, j, len=strlen(s); if(mark == 1) i ++; if(mark && len==1) return 0; //只由一个负号非法 if(s[i] == ‘0‘) return 0;//有前导0 非法 if(len == 0 || len > 15) return 0;//字符串为空串或者长度太长 非法 for(j = i; s[j]; j++) { if(s[j] >= ‘0‘ && s[j] <= ‘9‘) continue; return 0; //包含非数字字符 非法 } return 1; } int main() { int i, mark, legal, ok, a, b; LL suk;//计算合法的串的结果 while(gets(s) != 0) { scanf("%d %d%*c", &a, &b); ok = suk = mark = legal = 0; if(s[0] == ‘-‘) mark = 1; legal = judge(mark);//1 表示合法,0表示非法 if(legal)//合法的字符串参与 计算 { i = 0; if(mark) i = 1; for(; s[i]; i++) suk = suk*10+s[i]-‘0‘; if(mark) suk *= -1; if(suk >= a && suk <= b) ok = 1; } int len = strlen(s); if (len == 1 && s[0] == ‘0‘ && 0 >= a && 0 <= b) ok = 1;//只有1个0的情况也属合法的 if(ok) puts("YES"); else puts("NO"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/PersistFaith/p/5392293.html