poj1029

这一题和前面做的一道题几乎是一样的,只不过是有个地方犯傻了,唉,wa了好几次

说下思路,

如果是=,则把每个值都赋为2000(这个数一定要比比较的次数大啊,我刚开始开了100,wa了好几次,唉,你说这能不让人窝火吗)

如果是<,把左边的值不为2000的数减一,右边不为2000的数加1

如果是>,则反过来

最后查找不为2000的绝对值最大的数,则该数必为假币,至于是否会输出0这个结果,那就要看不为2000的绝对值最大的数知否只有一个,如果只有一个,那就是要求的结果,如果多个,那么就输出0

  1 #include <iostream>
  2 #include <stdlib.h>
  3 using namespace std;
  4 
  5 int flag[1005];
  6 int main()
  7 {
  8   int n,k;
  9   cin>>n>>k;
 10   int i,j,p;
 11 
 12   int left[1005];
 13   int right[1005];
 14   char c[3];
 15   for(i=0;i<k;i++)
 16   {
 17   cin>>p;
 18   for(j=0;j<p;j++)
 19   {
 20   cin>>left[j];
 21   }
 22   for(j=0;j<p;j++)
 23   {
 24   cin>>right[j];
 25   }
 26   cin>>c;
 27   if(c[0]=='=')
 28   {
 29   for(j=0;j<p;j++)
 30   {
 31   flag[left[j]]=2000;
 32   }
 33   for(j=0;j<p;j++)
 34   {
 35   flag[right[j]]=2000;
 36   }
 37 
 38   }
 39   if(c[0]=='>')
 40   {
 41   for(j=0;j<p;j++)
 42   {
 43   if(flag[left[j]]!=2000)
 44   {
 45   flag[left[j]]++;
 46   }
 47   }
 48   for(j=0;j<p;j++)
 49   {
 50   if(flag[right[j]]!=2000)
 51   {
 52   flag[right[j]]--;
 53   }
 54   }
 55   }
 56   if(c[0]=='<')
 57   {
 58   for(j=0;j<p;j++)
 59   {
 60   if(flag[left[j]]!=2000)
 61   {
 62   flag[left[j]]--;
 63   }
 64   }
 65   for(j=0;j<p;j++)
 66   {
 67   if(flag[right[j]]!=2000)
 68   {
 69   flag[right[j]]++;
 70   }
 71   }
 72   }
 73   }
 74   int max=-1;
 75   int ans;
 76   int mount=1;
 77   /*for(i=1;i<=n;i++)
 78   {
 79   cout<<flag[i]<<endl;
 80   }*/
 81   for(i=1;i<=n;i++)
 82   {
 83   if(flag[i]!=2000 && abs(flag[i])>=max)
 84   {
 85   if(abs(flag[i])>max)
 86   {
 87   max=abs(flag[i]);
 88   ans=i;
 89   mount=1;
 90   }
 91   else if(abs(flag[i])==max)
 92   {
 93   mount++;
 94   }
 95   }
 96 
 97   }
 98   if(mount==1) cout<<ans<<endl;
 99   else cout<<0<<endl;
100   //cout<<ans<<endl;
101   return 0;
102 }

posted on 2012-08-05 19:03  矮人狙击手!  阅读(875)  评论(0编辑  收藏  举报

导航