码迷,mamicode.com
首页 > 其他好文 > 详细

zznu组队赛⑧

时间:2016-04-14 19:26:48      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

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;
}

  

zznu组队赛⑧

标签:

原文地址:http://www.cnblogs.com/PersistFaith/p/5392293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!