例题3-4 Master-Mind Hints UVA - 340

看了半天,没看题解和原题,照着汝佳大佬那两句汉语解释(真的是只有两句啊!)敲了很久,愣是怎么调都调不对,并且最后发现我采用的算法不相容,两种用例一定有一个不满足,是个逻辑错误。我先是怀疑题目出错了,想放一边不管了,但是到网上一搜题解,才发现别人也被题意绕晕了,毕竟全英的,还特别长。找了好几篇博客读中文题意,才明白。

题意总的来说,就是对自己的输入序列,先匹配有多少个位置猜对了,是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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值