天天看点

紫书第三章例题3-4 uva340

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;}