uva340 统计正确位置(A)的数字很简单,扫一遍两个数组判断是否匹配即可。统计出现过的数字但位置不对的数字数目从正面推比较难。
可以这么思考:出现过的数字但位置不对的数字数目=总数-正确位置数字的总数(A)
那么,只要求出所有所谓所有数字的“总数”即可。那么总数又是什么,我认为是上下相同数字的匹配数,如下面 1有2个匹配数,5有1个匹配数(1与1匹配,5与5匹配,无论位置是否正确),如果位置正确,
那它会被加到正确位置数字的总数上,不正确的,我们通过上面的减法求出.通过上面的观察我们大致知道(?)匹配数=总数=min(上下两个序列中该数字出现的次数)
比如 正确 序列: 1 1 5 5 5
猜想 序列: 1 2 5 1 1 这里1匹配数有2,正确的有1个。(A=1,总数=2)
2匹配数没有(上下没有同事含2)(A=1,总数=2)
5匹配数有1,正确的有1个(A=1+1,总数=2+1)
所以这个猜想是 (2,1) 其中A=2,错的(1)=总数(3)-正确的(2)
最后代码...
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){ int i,j,k,n,flag=0;int booka[15],bookb[15];int ans[10000],b[10000];
while(scanf("%d",&n)!=EOF&&n!=0){ memset(booka,0,sizeof(booka)); memset(bookb,0,sizeof(bookb));
for(i=1;i<=n;i++){
cin>>ans[i];
}
for(i=1;i<=n;i++){
for(j=1;j<=9;j++) {
if(ans[i]==j) { booka[j]++;
}
}
}
printf("Game %d:\n",++flag);
while(1){memset(bookb,0,sizeof(bookb));memset(b,0,sizeof(b));int A=0,t=0,B=0;for(i=1;i<=n;i++) { cin>>b[i];
} if(b[1]==0&&b[2]==0&&b[3]==0) break;
for(i=1;i<=n;i++) { if(ans[i]==b[i]) A++;
}
for(i=1;i<=n;i++){
for(j=1;j<=9;j++) {
if(b[i]==j) { bookb[j]++;
}
}
}
for(j=1;j<=9;j++) { t=min(booka[j],bookb[j]); B+=t;
}
printf(" (%d,%d)\n",A,B-A);
}
}
return 0;}