我的PKU ACM POJ1029题解

[原创]我的PKU ACM POJ1029题解

这题和POJ1013几乎相同,碰到了也厚颜无耻的再做了一遍来充数。^_^

Source Code

Problem: 1029
User: absolute
Memory: 212K
Time: 16MS
Language: C++
Result: Accepted
  • Source Code
  • #include <stdio.h>
    int main()
    {
    int N,K,i,j;
    bool real[1000]={0};
    int heavy[1000]={0},light[1000]={0};
    scanf("%d %d",&N,&K);
    for(i=0;i<K;i++)
    {
    int pancoins,leftcoins[500],rightcoins[500];
    char result;
    scanf("%d",&pancoins);
    for(j=0;j<pancoins;j++)
    {
    scanf("%d",leftcoins+j);
    }
    for(j=0;j<pancoins;j++)
    {
    scanf("%d",rightcoins+j);
    }
    getchar();
    scanf("%c",&result);
    getchar();
    //平衡则放入真数组,表示这次称的都是真币
    if(result=='=')
    {
    for(j=0;j<pancoins;j++)
    {
    real[leftcoins[j]-1]=true;
    real[rightcoins[j]-1]=true;
    }
    }
    //右边下降,左边怀疑为轻,右边为重
    else if(result=='<')
    {
    for(j=0;j<pancoins;j++)
    {
    light[leftcoins[j]-1]++;
    heavy[rightcoins[j]-1]++;
    }
    }
    //左边怀疑为重,右边怀疑为轻
    else if(result=='>')
    {
    for(j=0;j<pancoins;j++)
    {
    heavy[leftcoins[j]-1]++;
    light[rightcoins[j]-1]++;
    }
    }

    }
    bool sure=true;
    int falsecoin=0,unreal;
    int times=0;
    int realnums=0;
    //假币必然是不在真数组中,而且它必然只能在重数组和轻数组之一出现,而不能同时出现
    //但是有可能被怀疑的只称过一次,所以必须选出被怀疑最多次的那个
    //如果有两个以上相同最多次的则无法确定
    for(j=0;j<N;j++)
    {
    if(real[j]==true)
    {
    realnums++;
    continue;
    }
    unreal = j+1;
    if(light[j]>0&&heavy[j]==0)
    {
    if(light[j]==times)
    sure = false;
    else if(light[j]>times)
    {
    falsecoin = j+1;
    sure = true;
    times = light[j];
    }
    }
    else if(light[j]==0&&heavy[j]>0)
    {
    if(heavy[j]==times)
    sure = false;
    else if(heavy[j]>times)
    {
    falsecoin = j+1;
    sure = true;
    times = heavy[j];
    }
    }
    }
    //只有一个没有称的是假币
    if(realnums==N-1)
    {
    falsecoin = unreal;
    }
    if(sure)
    printf("%d\n",falsecoin);
    else
    printf("0\n");
    return 0;
    }

你可能感兴趣的:(ACM)