20190806

T1:

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=200+10;
struct person{
    string name;
    int is_[maxn],not_[maxn],id,today,is_self,not_self,is,no;
    person()
    {
        name.resize(0);is_self=not_self=today=is=no=0;
        memset(is_,0,sizeof(is_));
        memset(not_,0,sizeof(not_));
    }
}p[maxn];

map<string,int>id;
int n,m,Q;
string name[40];

char input(char &ch){ch=getchar();return ch;}

int check(string s)
{
    if(s=="Monday.")   return 1;
    if(s=="Tuesday.")  return 2;
    if(s=="Wednesday.")return 3;
    if(s=="Thursday.") return 4;
    if(s=="Friday.")   return 5;
    if(s=="Saturday.") return 6;
    if(s=="Sunday.")   return 7;
    return 0;
}

int init_data()
{
    cin>>n>>m>>Q;
    string s[5];int tot=0;
    for(int i=1;i<=n;i++)
    {
        cin>>name[i];
        id[name[i]]=++tot;
        p[tot].name=name[i];
        p[tot].id=tot;
//        printf("%d:%s  %d\n",i,s[0].c_str(),id[s[0]]);
    }

    while(Q--)
    {
        char ch;cin>>s[0];
        int l=s[0].length();
        s[0].resize(l-1);
        int iid=id[s[0]],cnt=1,flag=0;
//        printf("\n\n%dth person: %s\n",Q,s[0].c_str());
        for(;;cnt++)
        {
            if(input(ch)=='\n'||ch==EOF) break;
            if(cnt==5) {flag=1;break;}
            cin>>s[cnt];
        }
        cnt--;
        if(!flag) // useful
        {
            if(cnt==3)
            {
              if(s[1]=="Today"&&s[2]=="is")
              {
                  int day=check(s[3]);
                  if(day) p[iid].today=day;
              }
              else if(s[2]=="is"&&s[3]=="guilty.")
              {
                int xid=id[s[1]];
                if(xid) p[iid].is_[++p[iid].is]=xid;
              }
              else if(s[1]=="I"&&s[2]=="am"&&s[3]=="guilty.")
              {
                  p[iid].is_self=1;
              }
            }
            else if(cnt==4)
            {
              if(s[1]=="I"&&s[2]=="am"&&s[3]=="not"&&s[4]=="guilty.")
              {
                p[iid].not_self=1;
              }
              else if(s[2]=="is"&&s[3]=="not"&&s[4]=="guilty.")
              {
                int xid=id[s[1]];
                if(xid) p[iid].not_[++p[iid].no]=xid;
              }
            }
        }
        else //don't need
            for(;input(ch)!='\n'&&ch!=EOF;scanf("%*s")) ;
    }
    return tot;
}

void debug(int n)
{
    for(int i=1;i<=n;i++)
    {
        printf("%dth:\n",i);
        printf("  name:%s\n",p[i].name.c_str());
        printf("  id:%d\n",p[i].id);
        printf("  today:%d\n",p[i].today);
        printf("  is_self:%d\n",p[i].is_self);
        printf("  not_self:%d\n",p[i].not_self);
        printf("  other_is:%d\n",p[i].is);

        if(p[i].is)
        {
            for(int j=1;j<=p[i].is;j++)
              printf("    guilty %d: %s\n",j,name[p[i].is_[j]].c_str());
            int fsn=0x7fffffff;
        }
        printf("  other_not:%d\n",p[i].no);
        if(p[i].no)
        {
            for(int j=1;j<=p[i].no;j++)
              printf("    not guilty %d: %s\n",j,name[p[i].not_[j]].c_str());
        }
    }
}

int check(int g,int d)
{
    int lie=0,cnt=0;
    for(int i=1;i<=n;i++)
    {
        int t=0,f=0;
        if(p[i].today)
        {
            if(p[i].today!=d) f=1;
            else t=1;
        }  
        if(p[i].not_self==1)
        {
            if(i==g) f=1;
            else t=1;
        }
        if(p[i].is_self==1)
        {
            if(i!=g) f=1;
              else t=1;
        }
        if(p[i].is)
        {
            for(int j=1;j<=p[i].is;j++)
              if(f&&t) break;
              else if(p[i].is_[j]!=g) f=1;
              else t=1;
        }
        if(p[i].no)
        {
            for(int j=1;j<=p[i].no;j++)
              if(t&&f) break;
              else if(p[i].not_[j]==g) f=1;
              else t=1;
        }
        if(t&&f) return false;
        if(f) lie++;
        if(!t&&!f) cnt++;
    }
    if(lie>m) return false;
    if(lie+cnt<m) return false;
    else return true;
}

int main()
{
    freopen("std.in","r",stdin);
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
    init_data();
    int guilty,cnt=0;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=7;j++)
      {
          if(check(i,j))
        {
            if(++cnt==2)  
            {
                printf("Cannot Determine");
                return 0;
            }
            guilty=i;
            break;
        }
      }
    if(cnt==1) cout<<name[guilty];
    else printf("Impossible");
    return 0;
}

T2:

#include<bits/stdc++.h>
using namespace std;
int n,m,f[50005],ne[100005],way,cho,dist[50005],x,y,z,s,mx;
long long pj;
bool cho2,cho3,ver[50005];
struct node{
    int u,v,w;
}mp[100005];
priority_queue<pair <int,int> >q;
inline int read(){
    int k=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar())
      if(c=='-')
        f=-1;
    for(;isdigit(c);c=getchar())
      k=k*10+c-'0';
    return k*f;
}
inline void add(int num){
    ne[num]=f[mp[num].u];
    f[mp[num].u]=num;
    return ;
}
inline bool cmp(const node &a,const node &b){
    return a.w<b.w;
}
int main(){
    freopen("track.in","r",stdin);
    freopen("track.out","w",stdout);
    n=read();
    way=read();
    m=n-1;
    if(way==1)
      cho=1;
    for(int i=1;i<=m*2;i+=2){
        mp[i+1].v=mp[i].u=read();
        mp[i+1].u=mp[i].v=read();
        mp[i+1].w=mp[i].w=read();
        pj+=mp[i].w;
        if(mp[i].u!=mp[i].v-1||mp[i+1].u!=mp[i+1].v-1)
          cho2=true;
        if(mp[i].u!=mp[i-2].u&&i!=1)
          cho3=true;
        add(i),add(i+1);
    }
    if(!cho2)
      cho=2;
    if(!cho3)
      cho=3;
    if(cho==1){
        for(int i=1;i<=n;i++)
          dist[i]=1e9;
        dist[1]=0;
        q.push(make_pair(0,1));
        while(q.size()){
            x=q.top().second,q.pop();
            if(ver[x])
              continue;
            ver[x]=true;
            for(int i=f[x];i;i=ne[i]){
                y=mp[i].v;z=mp[i].w;
                if(dist[y]>dist[x]+z){
                    dist[y]=dist[x]+z;
                    q.push(make_pair(-dist[y],y));
                }
            }
        }
        for(int i=1;i<=n;i++){
//            cout<<dist[s]<<" "<<dist[i]<<endl;
            if(dist[s]<dist[i])
              s=i;
//            cout<<dist[i]<<" ";
            
        }
        for(int i=1;i<=n;i++){
            dist[i]=1e9;
            ver[i]=false;
        }
//        cout<<s<<endl;
        while(q.size())
          q.pop();
        dist[s]=0;
        q.push(make_pair(0,s));
        while(q.size()){
            x=q.top().second,q.pop();
            if(ver[x])
              continue;
            ver[x]=true;
            for(int i=f[x];i;i=ne[i]){
                y=mp[i].v;z=mp[i].w;
                if(dist[y]>dist[x]+z){
                    dist[y]=dist[x]+z;
                    q.push(make_pair(-dist[y],y));
                }
            }
        }
        for(int i=1;i<=n;i++){
            mx=max(dist[i],mx);
        }
        cout<<mx<<endl;
        return 0;
    }
//    cout<<cho<<endl;
    if(cho==3){
        sort(mp+1,mp+m*2,cmp);
//        for(int i=1;i<=m*2;i++)
//          cout<<mp[i].w<<" ";
        cout<<mp[m*2-way*2+1].w<<endl;
        return 0;
    }
    if(way==m){
        sort(mp+1,mp+m*2,cmp);
        cout<<mp[1].w<<endl;
        return 0;
    }
    cout<<pj/way<<endl;
    return 0;
}

T3:

#include<bits/stdc++.h>
using namespace std;
int T,n,a[105],mx;
bool book[1005];
vector<int>v;
inline int read(){
    int k=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar())
      if(c=='-')
        f=-1;
    for(;isdigit(c);c=getchar())
      k=k*10+c-'0';
    return k*f;
}
inline void dfs(int num){
    if(num>mx)
      return;
    else
      book[num]=true;
    for(int i=0;i<v.size();i++)
      dfs(num+v[i]);
    return;
}
int main(){
    freopen("money.in","r",stdin);
    freopen("money.out","w",stdout);
    T=read();
    while(T--){
        n=read();
        while(v.size())
          v.pop_back();
        for(int i=1;i<=mx;i++)
          book[i]=false;
        for(int i=1;i<=n;i++)
          a[i]=read(),mx=max(mx,a[i]);
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++){
            if(!book[a[i]]){
                book[a[i]]=true;
                v.push_back(a[i]);
                dfs(0);
            }
        }
        cout<<v.size()<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值