现在的位置: 首页 > 综合 > 正文

ZOJ 1184

2013年03月26日 ⁄ 综合 ⁄ 共 2013字 ⁄ 字号 评论关闭

//////////////////////////////////////////////////////////////////////////////
//2353416     2010-11-19 01:19:11     Accepted     1184     C     0     160     VRS
//1184 硬币称重 贪心
//even就肯定是正常的,凡是出现up或down,问题硬币肯定在几次都轻,或都重的地方
//所以它在该情况肯定出现次数最多,创建一个coins数组,记录轻重次数,up的就+1,down就-1,
//绝对值最大的就是问题硬币
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

 

int coins[15];
char lr_Side[2][3][15];

void ChangeCoins(int loc,int staMark)
{
    if(staMark==0)
        coins[loc]=10000;
    else if(staMark==1 && coins[loc]!=10000)
        coins[loc]++;
    else if(staMark==2 && coins[loc]!=10000)
        coins[loc]--;
}

void ProcessCoins(int lr,int level,int sta)
{
    int i;
    int loc;
    for(i=0;i<(int)strlen(lr_Side[lr][level]);i++)
    {
        loc=lr_Side[lr][level][i]-'A';
        if(sta==0)
            ChangeCoins(loc,sta);
        else if(sta==lr+1)                        //这里是利用刚好的关系,简化代码
            ChangeCoins(loc,2);
        else
            ChangeCoins(loc,1);
    }
    return;
}

int main()
{
    char status[3][5];
    int testcase;
    int i;
    int staMark;
    int min,max;
    int minLoc,maxLoc;
    scanf("%d",&testcase);
    while(testcase--)
    {
        memset(coins,0,sizeof(coins));
        for(i=0;i<3;i++)
            scanf("%s %s %s",&lr_Side[0][i],&lr_Side[1][i],&status[i]);
        for(i=0;i<3;i++)
        {
            if(strcmp(status[i],"even\0")==0)
                staMark=0;
            else if(strcmp(status[i],"up\0")==0)
                staMark=1;
            else
                staMark=2;
            ProcessCoins(0,i,staMark);
            ProcessCoins(1,i,staMark);
        }
        min=0;max=0;
        for(i=0;i<12;i++)
        {
            if(coins[i]==10000)
                continue;
            else if(coins[i]<min)
            {
                min=coins[i];
                minLoc=i;
            }
            else if(coins[i]>max)
            {
                max=coins[i];
                maxLoc=i;
            }
            else if(coins[i]==min)
                minLoc=-1;
            else if(coins[i]==max)
                maxLoc=-1;
        }
        if(minLoc!=-1)
            printf("%c is the counterfeit coin and it is heavy.\n",'A'+minLoc);
        else
            printf("%c is the counterfeit coin and it is light.\n",'A'+maxLoc);
    }
    return 0;
}

抱歉!评论已关闭.