P1039 数据3 挂求调
查看原帖
P1039 数据3 挂求调
212382
Enthon_Yuan楼主2022/11/19 07:57
#include <bits/stdc++.h>
using namespace std;
const int Len = 256;
const int N = 25;
map<string,int> mapz;
string tmp,data[N];
string names[N];
char str[Len];
int n,m,k,cnt,xx[N];
int fake[N],date[N],num;
int link[N][N],notlink[N][N],speak[N],islink[N];
int zuifan,ans;
int tru[N];
string now;
bool flag;
map<string,int> dat;
bool check()
{
    memset(tru,0,sizeof tru);
    dat.clear();
    now.clear();
    flag=0;
    for(int i = 1;i <= n;i++) 
    if(fake[i]) tru[i]=-1;
    for(int i = 1;i <= n;i++)
    {
        if(link[i][zuifan])
        {
            if(tru[i] != -1) tru[i] = 1;
            else return 0;
        }
        if(notlink[i][zuifan])
        {
            if(tru[i] != 1) tru[i] = -1;
            else return 0;
        }
        for(int j = 1;j <= n;j++)
        {
            if(j == zuifan) continue;
            if(link[i][j])
            {
                if(tru[i] != 1) tru[i] = -1;
                else return 0;
            }
            if(notlink[i][j])
            {
                if(tru[i] != -1) tru[i] = 1;
                else return 0;
            }
        }
    }
    for(int i = 1;i <= n;i++)
    {
        if(!date[i]) continue;
        if(tru[i] == 1)
        {
            if(dat[data[i]] == 1) return 0; 
            if(flag and now != data[i]) return 0;
            else flag=1,now=data[i];
        }else if(tru[i] == -1){
            dat[data[i]]=1;
            if(data[i] == now) return 0;
        }
    }
    if(dat[now]) return 0;
    for(int i = 1;i <= n and flag;i++)
    {
        if(!date[i]) continue;
        if(data[i] == now)
        {
            if(tru[i] != -1) tru[i]=1;
            else return 0;
        }
        if(data[i] != now)
        {
            if(tru[i] != 1) tru[i]=-1;
            else return 0;
        }
    }
    int ccc=0,ddd=0;
    for(int i = 1;i <= n;i++)
    if(tru[i] == 1) ccc++;
    else if(tru[i] == -1) ddd++;
    if(ddd > m) return 0;
    if(n-ccc < m) return 0;
    if(flag == 0)
    {
        string dddq[]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
        for(int i = 1;i <= 7;i++)
        {
            int ppd=0,qqd=0;
            for(int j = 1;j <= n;j++)
            {
                if(date[j] and data[j] == dddq[i]) ppd++;
                if(date[j] and data[j] != dddq[i]) qqd++;
            }
            if(ddd+qqd <= m and n-(ccc+ppd) >= m) return 1;
        }
        return 0;
    }
    return 1;
}
string shake(string x)
{
    int len=x.length();
    for(int i = 0;i <= len-1;i++)
    if(x[i] >= 'A' and x[i] <= 'Z') x[i]=x[i]-'A'+'a';
    return x;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i = 1;i <= n;i++)
    {
        cin >> tmp;
        mapz[tmp]=++cnt;
        names[i]=tmp;
    }
    for(int id = 1,x;id <= k;id++)
    {
        scanf("%s",str),str[strlen(str)-1]='\0';
        tmp = str;
        int index = mapz[tmp];
        if(speak[index] == 0) speak[index]=1,num++;
        getline(cin,tmp);
        string pdd = shake(tmp);
//      cout << pdd<< endl;
        if(pdd.find("i am guilty.") != -1) xx[index]=1,link[index][index]=1;
        else if(pdd.find("i am not guilty.") != -1) notlink[index][index]=1;
        else if(pdd.find("today is") != -1){
            string dd;
            for(int i = 10;i < tmp.length();i++)
            {
                if(tmp[i] != '.' and tmp[i] != ' ') dd+=tmp[i]; 
                else break;
            }
            if(date[index] and data[index] != dd and fake[index] == 0) fake[index]=1;
            date[index]=1;
            data[index]=dd;
//          cout << dd << endl;
        }else if(pdd.find("is guilty.") != -1){
            string dd;
            for(int i = 1;tmp[i] != ' ';i++) dd += tmp[i];
            if(islink[index] and islink[index] != mapz[dd]) fake[index]=1;
            link[index][mapz[dd]]=1;
            islink[index]=index;
//          cout << dd << endl;
        }else if(pdd.find("is not guilty.") != -1){
            string dd;
            for(int i = 1;tmp[i] != ' ';i++) dd += tmp[i];
            notlink[index][mapz[dd]]=1;
//          cout << dd << endl;
        }
    }
    for(int i = 1;i <= n;i++)
    {
        zuifan=i;
        if(check())
        {
            if(ans) return printf("Cannot Determine\n"),0;
            ans=i;
        }
    }
    if(ans == 0) printf("Impossible\n");
    else cout << names[ans] << endl;
    return 0;
}

没有下载次数了QAQ,数据没保存下来

2022/11/19 07:57
加载中...