zoukankan      html  css  js  c++  java
  • PAT A1048 Werewolf

    题目描述

    链接
    n个人, n个描述,+5代表5号人是好人,共两个狼人,两个说谎,其中一个是狼人,求可能的方案

    分析

    • 编写函数check(i,j), 关键是i j怎么定义!!!定义为说谎者的话,本来考虑不周全,而且要交换i j,因为狼人是其中一个,明显不对!!也走了大弯路
    • 想简单点,直接i,j就是两个狼人。则可以定义b数组,标记好人和坏人,用1和-1标记,标记好后,逐个读入描述a[k],如果b[abs(a[k])] * a[k] < 0 说明与真实情况不一致,则k是说谎者,lie数组加入k。最后判断lie数组size是否为2,且两个人中一个好一个坏,即b[lie[0]] + b[lie[1]] == 0
    • 唉,走偏了!!!

    代码

    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        vector<int> v(n+1);
        for (int i = 1; i <= n; i++) cin >> v[i];
        for (int i = 1; i <= n; i++) {
            for (int j = i + 1; j <= n; j++) {
                vector<int> lie, a(n + 1, 1);
                a[i] = a[j] = -1;
                for (int k = 1; k <= n; k++)
                    if (v[k] * a[abs(v[k])] < 0) lie.push_back(k);
                if (lie.size() == 2 && a[lie[0]] + a[lie[1]] == 0) {
                    cout << i << " " << j;
                    return 0;
                }
            }
        }
        cout << "No Solution";
        return 0;
    }
    

    错误

    #include<bits/stdc++.h>
    using namespace std;
    
    
    const int maxn = 105;
    int a[maxn], n, b[maxn], c[maxn];
    pair<int, int> res;
    
    bool cmp(pair<int,int> a, pair<int,int> b){
        if(a.first == b.first) return a.second < b.second;
        return a.first < b.first;
    }
    
    bool check(int i, int j){
        memset(b, 0, sizeof(b));
        vector<int> tmp;
        for(int k=1;k<=n;k++) a[k] = c[k]; //初始化
        a[i] = -a[i]; a[j] = -a[j]; //说谎者
        for(int k=1;k<=n;k++){
            if(b[abs(a[k])] == 0){ //未被标记过
                b[abs(a[k])] = a[k]>0?1:-1;
            }
            else if(b[abs(a[k])] != (a[k]>0?1:-1)){
                return false;
            } //两人说法矛盾
        }
        if(b[i] > 0) return false; //有一个必须是狼人
        for(int k=1;k<=n;k++){
            if(b[k]<=0) tmp.push_back(k);
        }
        if(tmp.size() != 2) return false; //狼人数不为2
        res = make_pair(tmp[0], tmp[1]);
        return true;
    }
    
    
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>c[i];
        }
        bool flag = 0;
        vector<pair<int,int> > ans;
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                if(check(i,j)){
                    flag = 1;
                    ans.push_back(res);
                }
                if(check(j, i)){
                    flag = 1;
                    ans.push_back(res);
                }
            }
        }
        if(!flag){
            cout<<"No Solution"<<endl;
        }else{
            sort(ans.begin(), ans.end(), cmp);
            printf("%d %d
    ", ans[0].first, ans[0].second);
        }
    
    }
    
    
  • 相关阅读:
    Oracle X$ View:X$KJMSDP
    explore my oracle support using firefox 3.6
    EnterpriseDB Migration 迁移工具使用测试(2)
    What's preconnect.svc in 11g RAC?
    Mysql:语法:注释
    Mysql:命令选项、配置选项、(全局、会话)系统变量、状态变量:总揽
    Mysql:简单“破解”SQLyog Enterprise 812 Trial
    Mysql:函数之一:information functions
    Mysql:语法:虚拟表DUAL
    VC++.Net2005的一些常识(转)
  • 原文地址:https://www.cnblogs.com/doragd/p/11454804.html
Copyright © 2011-2022 走看看