正确答案(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 }

时间: 2024-10-05 15:32:27

正确答案(answer)的相关文章

【考前模拟】正确答案

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

java能不能自己写一个类叫java.lang.System/String正确答案

原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.System? 网上提供的答案:通常不可以,但可以采取另类方法到达这个需求.所谓的另类方法指自己写个类加载器来加载java.lang.System到达目的. 首先表明下我的观点.上述答案完全是误导读者,是不正确的答案.我就疑惑了网上怎样把这类完全不正确的搜索结果排在前面,而且几近搜到的都是这类不正确的

3.5星|《是谁出的题这么难,到处都是正确答案》:?麦肯锡的经历,文艺妈妈的笔,温馨的父母与丈夫

作者1978年生人,做过麦肯锡的商业分析,在亚马逊中国工作过,后来先后加入过两个创业公司.个人离婚后3年遇到第二任丈夫,父母是上海知青,在江西插队11年,1977年回上海. 主要内容是两类:1:麦肯锡工作经验:2:个人生活回忆. 麦肯锡的工作经验,说的是一些大原则,比如如何分解复杂问题,比如一定要把问题定义清楚.这些内容虽然也是管理学常识,但是也是比较少见的来自亲历者的概括总结.挂名麦肯锡的书,大部分都不好,包括大前研一的书,相较而言本书讲麦肯锡的部分相当不错. 没怎么提作者在亚马逊中国和后面两

sql基础题目测试及正确答案

在网上做了一套基本的sql题目,以下是我的写的答案,适合基础人员练练 --创建测试数据 use test create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10)) insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男') insert into Student values('02' , N'钱电' , '199

准确且巧妙的躲过了正确答案;

#include<iostream>#include<cstdio>using namespace std;int main(){ //freopen("T1.in","r",stdin); //freopen("T1.out","w",stdout); int n,m,c=0; int a[10100]; cin>>n>>m; for(int i=1;i<=n;i++)

给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…) 请你求出这个序列的第N项的值(用10进制数表示)。 例如,对于k=3,N=100,正确答案应该是9

只有1行,为2个正整数,用一个空格隔开: k N (k.N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000). 计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*10^9).(整数前不要有空格和其他符号). #include<stdio.h> int n2[1010];long long l1 = 1; long long n, k; long long sm(long long i,long long k) { long long s = 1; int j; fo

leetcode算法 - Word Break II js实现

题目如下:Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, givens = "catsanddog",dict = ["cat", "cats&

四则运算实现用户输入答案并统计正确数量

一,设计思路: 本次的实现目标是在上次代码的基础之上实现用户输入答案,并判断答案是否正确并进行统计,最后输出正确答案的个数. 判断答案是否正确的思路是在上次的基础之上先定义wrong(用来统计错误个数)right(用来统计正确的个数)k1,参数. 在void Display函数中定义答案的判断和正确错误的统计,最后在主函数中通过指针的调用来实现答案正确和错误个数的统计. 二,源代码: #include<stdlib.h>#include<iostream.h>#include<

ajax获取json形式得题目和答案 实现答题功能

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="css/public.css"/> <style> .col-container{ margin:30px auto;