看了半天,没看题解和原题,照着汝佳大佬那两句汉语解释(真的是只有两句啊!)敲了很久,愣是怎么调都调不对,并且最后发现我采用的算法不相容,两种用例一定有一个不满足,是个逻辑错误。我先是怀疑题目出错了,想放一边不管了,但是到网上一搜题解,才发现别人也被题意绕晕了,毕竟全英的,还特别长。找了好几篇博客读中文题意,才明白。
题意总的来说,就是对自己的输入序列,先匹配有多少个位置猜对了,是first;对那些位置没猜对,但是出现在答案序列别的位置的数,每匹配一对,就是second++;注意,已经匹配的数对,则两个答案序列和猜测序列的对应位置的数就都不能参与其他匹配了。最后输出first和second。
看着很麻烦,但是如果用纯模拟来做,确实比较麻烦,但是如果多画几个匹配图,分析就能知道,既然数字就1-9这9种,那对每个数字i,分别统计答案序列和猜测序列中i的出现次数,显然,出现次数少的,才会有匹配,才会成为second的一部分,将它们加和,再减去匹配中包含的完全匹配(位置相同,数字相同),就是我们真正要的second了。
程序是汝佳大佬的,今天太晚了,我明天再自己打吧。
#include <bits/stdc++.h>
#define N 1005
using namespace std;
int ori[N],nw[N];
int main() {
int n,num=0;
while (scanf("%d",&n)&&n) {
for (int i=0;i<n;i++) scanf("%d",&ori[i]);
printf("Game %d:\n",++num);
while (true) {
int a=0,b=0;
for (int i=0;i<n;i++) scanf("%d",&nw[i]);
if (nw[0]==0) break;
for (int i=0;i<n;i++)
if (ori[i]==nw[i]) a++;
for (int i=1;i<=10;i++) {
int cnta=0,cntb=0;
for (int j=0;j<n;j++) {
if (ori[j]==i) cnta++;
if (nw[j]==i) cntb++;
}
b+=min(cnta,cntb);
}
printf(" (%d,%d)\n",a,b-a);
}
}
return 0;
}