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 }