正确答案 全国信息学奥林匹克联赛( ( NOIP2014) 复 赛 模拟题 Day1 长乐一中
2016-11-14 17:15
267 查看
【题目描述】
小 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.
長樂一中給出的解析:
30%: O(n ^ 2 * m)暴力判断。
100%: 很显然答案的可能性最多只有 n 种,所以我们将所有人的答案按字典序排序后枚举
将每个人的答案作为正确答案来进行判断。 由于是判断题, 若当前人的答案为正确答
案则零分者的答案也就确定了, 那么只需统计出这两种答案的人数判断是否满足题意
即可。这一步使用字符串哈希即可解决。
另外要注意 p = 0 和 p = q = 0 的情况。
長樂一中給出的正解代碼:
View Code
吐槽一下,這個答案很多時候并並不正確。
小 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.
長樂一中給出的解析:
30%: O(n ^ 2 * m)暴力判断。
100%: 很显然答案的可能性最多只有 n 种,所以我们将所有人的答案按字典序排序后枚举
将每个人的答案作为正确答案来进行判断。 由于是判断题, 若当前人的答案为正确答
案则零分者的答案也就确定了, 那么只需统计出这两种答案的人数判断是否满足题意
即可。这一步使用字符串哈希即可解决。
另外要注意 p = 0 和 p = q = 0 的情况。
長樂一中給出的正解代碼:
#include<map> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m,p,q,a,z=1; char ch[500],cn[500]; string st[30000];//儲存每個答案。 map <string,int> mm;//儲存每種答案出現的次數。 void part_1(){ for(int i=0;i<n;i++){//順序枚舉。 if(mm[st[i]]==p){ //假如當前答案的出現數等於正解數, for(int j=0;j<m;j++){//ch中是這個答案的錯排。 if(st[i][j]=='N') ch[j]='Y'; else ch[j]='N'; } if(mm[ch]==q){cout<<st[i]<<endl;return;}//並且它的錯排的出現數等於報零答案數,可以認為這是正解。 } } printf("-1\n");//如果沒有找到,即p,q不合法,輸出負一。 } void part_2(){ for(int i=0;i<n;i++){ if(mm[st[i]]==q){//如果當前答案的出現數等於報零答案數, for(int j=0;j<m;j++){ if(st[i][j]=='N') ch[j]='Y'; else ch[j]='N'; } if(!mm[cn]){cout<<ch<<endl;return;}//並且它的錯排,即正解,沒有出現過,則它的錯排合法。 } } printf("-1\n");//對於數據,並無意義。 } void part_3(){//正解和報零答案都沒有出現過,所以要捋一下全排列。 for(int i=0;i<m;i++){ cn[i]='N';//從字典序排列時最前面的先拿出。 z*=2;//z等於二的m次冪。 } for(int i=0;i<z/2;i++){//小於z可以理解,因為這是一個類似01字串的字符串。 a=m-1;cn[a]+='Y'-'N'; while(cn[a]==2*'Y'-'N'&&a>0){ cn[a--]='N'; cn[a]+='Y'-'N'; }//因為有錯排,所以是小於z/2。 for(int j=0;j<m;j++){ if(cn[j]=='N') ch[j]='Y'; else ch[j]='N'; } if(!mm[cn]&&!mm[ch]){cout<<cn<<endl;return;}//如果該排列即其錯排都為出現個,則該排列合法。 } printf("-1\n");//對於數據,並無意義。 } int main(){ freopen("answer.in","r",stdin); freopen("answer.out","w",stdout); scanf("%d%d%d%d",&n,&m,&p,&q); for(int i=0;i<n;i++){ scanf("%s",&ch);//一種比較簡單的讀入技巧,時間大概是直接cin流輸入的三分之一。 for(int j=0;j<m;j++) st[i]+=ch[j]; ++mm[st[i]];//記錄重新次數。 } sort(st,st+n);//因為答案要按字典序輸出,所以排一下序。 if(p) part_1(); if(!p&&q) part_2(); if(!p&&!q) part_3(); return 0; }
View Code
吐槽一下,這個答案很多時候并並不正確。
相关文章推荐
- 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
- 全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中
- 全国信息学奥林匹克联赛(NOIP2010)复赛 3.导弹拦截 解题报告
- 全国信息学奥林匹克联赛(NOIP2011)复赛 提高组 day2 T2 聪明的质监员
- 全国信息学奥林匹克联赛(NOIP2010)复赛 1.数字统计 解题报告
- 全国信息学奥林匹克联赛(NOIP2010)复赛 2.接水问题 解题报告
- 全国信息学奥林匹克联赛NOIP计算机基础知识
- 全国信息学奥林匹克联赛(NOIP2010)复赛 题目
- NOIP2016全国信息学分区普级组初赛答案
- CCF全国信息学奥林匹克联赛(NOIP2016)复赛模拟提高组 day2 解题报告
- 疫情控制 2012年NOIP全国联赛提高组(二分答案+贪心)
- 全国信息学奥林匹克联赛(NOIP2016 )复赛模拟(二)
- 全国青少年信息学(计算机)奥林匹克分区联赛竞赛大纲
- 全国信息学奥林匹克联赛(NOIP2016 )复赛模拟(三)
- NOIP2016全国信息学分区联赛提高组第二试 蚯蚓 ssl 2599 队列
- NOIP2016全国信息学分区联赛提高组第二试 蚯蚓
- NOIP2016全国信息学分区联赛提高组第二试 蚯蚓
- 全国青少年信息学奥林匹克分区联赛(N)竞赛大纲
- NOIP2016全国信息学分区联赛提高组第二试 组合问题
- wikioi 1166 矩阵取数游戏(2007年NOIP全国联赛提高组)