码迷,mamicode.com
首页 > 其他好文 > 详细

正确答案(answer)

时间:2017-08-03 11:27:48      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:body   存在   暴力   put   click   没有   main   意义   bsp   

正确答案(answer)

小H与小Y刚刚参加完UOIP外卡组的初赛,就迫不及待的跑出考场对答案。
“吔,我的答案和你都不一样!”,小Y说道,”我们去找神犇们问答案吧”。
外卡组试卷中共有m道判断题,小H与小Y一共从其他n个神犇那问了答案。之后又从小G那里得知,这n个神犇中有p个考了满分,q个考了零分,其他神犇不为满分或零分。这可让小Y与小H犯了难。你能帮助他们还原出标准答案吗?如有多解则输出字典序最小的那个。无解输出-1。

 

输入格式:

第一行四个整数n, m, p, q,意义如上描述。
接下来n行,每一行m个字符’N’或’Y’,表示这题这个神犇的答案。

 

输出格式:

仅一行,一个长度为m的字符串或是-1。

 

样例输入:

2 2 2 0
YY
YY

 

样例输出:

YY

 

数据范围:

30% : n <= 100.
60% : n <= 5000 , m <= 100.
100% : 1 <= n <= 30000 , 1 <= m <= 500. 0 <= p , q. p + q <= n.

 

时间限制:

1S

 

空间限制:

256M

 

这题刚开始没想到map,就直接打暴力了。后面才想到完全可以用map(yo自己怎么怎么sa呢)。

对于每一个学霸的答案,用map记录一下,及G[s]++(通过计数)。

然后枚举每一个学霸,如果他的答案在map里面正好出现了p次,与他完全相反的答案正好出现了q次,那么就可以更新答案了。

做完这步后,我们在判断一下是否存在无解的情况,无解的情况就是ans根本没有被更新。

当然,这题有一个坑,就是p=0且q=0的情况。

这个时候,答案就有点捉摸不定了。我们必须用到“加一算法”,从后面枚举(因为我们毕竟要得到字典序最小的)。

当枚举到某一个串,发现!G[s1]且!G[s2],那么输出这个串就好了。

(弱弱的说一句,不知道为什么只有95 pts)

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<algorithm>
 5 #include<map>
 6 #include<iostream>
 7 using namespace std;
 8 const int maxn=30005;
 9 map <string,int> G;
10 char s[maxn][505],ans[505],tmp[505];
11 int n,m,p,q;
12 void U(char c[]){
13     for (int i=0; i<m; i++)  if (c[i]>ans[i]) return; else tmp[i]=c[i];
14     for (int i=0; i<m; i++) ans[i]=tmp[i];
15 }
16 int main(){
17     scanf("%d%d%d%d",&n,&m,&p,&q);
18     for (int i=0; i<m; i++) ans[i]=Z;
19     for (int i=1; i<=n; i++) scanf("%s",s[i]),G[s[i]]++;
20     for (int i=1; i<=n; i++){
21         char s0[505]; memset(s0,0,sizeof s0);
22         for (int j=0; j<m; j++){
23             char c=s[i][j];
24             if (c==Y) c=N; else c=Y;
25             s0[j]=c;
26         }
27         int x=G[s[i]],y=G[s0];
28         if (G[s[i]]==p&&G[s0]==q) U(s[i]);
29         if (G[s[i]]==q&&G[s0]==p) U(s0);
30     }
31     bool fl=1;
32     for (int i=0; i<m; i++) if (ans[i]!=Z){fl=0; break;}
33     if (!fl) for (int i=0; i<m; i++) putchar(ans[i]);
34     else if (p==0&&q==0){
35         string s1,s2; bool cango=0;
36         for (int i=0; i<m; i++) s1+=N,s2+=Y;
37         while(1){
38             if(!G[s1]&&!G[s2]){cout<<s1; cango=1; return 0;}
39             int flag=-1;
40             for (int i=m-1; i>=0; i--) if(s1[i]==N){flag=i; break;}
41             if(flag==-1){puts("-1"); cango=1; return 0;}
42             s1[flag]=Y,s2[flag]=N;
43             for (int i=flag+1; i<m; i++) s1[i]=N,s2[i]=Y;
44         }
45         if (!cango) puts("-1");
46     }else puts("-1");
47     return 0;
48 }
View Code

 

正确答案(answer)

标签:body   存在   暴力   put   click   没有   main   意义   bsp   

原文地址:http://www.cnblogs.com/whc200305/p/7278205.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!