7-2 The Judger (25 分)




分析:在考试时候的想法是将每个选手所给的数与前面所有任意两个数字的差比较,如果相同且没有选手输入过这个数则该选手通过该轮。但是每次比较时是循环从头开始找任意两个数的差时间复杂度较高。

#include<cstdio>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
bool out[15];
bool vis[1000010], dif[1000010];
int ans[15][1010];
vector<int> num;
set<int> lose;
int cnt = 0;
int main()
{int a, b;scanf("%d%d", &a, &b);num.push_back(a), num.push_back(b);int n, m, res;scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)scanf("%d", &ans[i][j]);for(int j = 1; j <= m; j++){for(int i = 1; i <= n; i++){if(out[i] == true)continue;int res = ans[i][j];int flag = 0;for(int k = 0; k < num.size(); k++){for(int q = k+1; q < num.size(); q++){if(abs(num[k]-num[q]) == res && vis[res] == false){flag = 1;vis[res] = true;num.push_back(res);break;}}if(flag == 1) break;}if(flag == 0) {if(cnt > 0)printf("\n");printf("Round #%d: %d is out.", j, i);cnt++;out[i] = true;lose.insert(i);}}}if(lose.size() == n){if(cnt > 0)printf("\n");printf("No winner.");}else{if(cnt > 0) printf("\n");printf("Winner(s):");for(int i = 1; i <= n; i++){if(out[i] == false)printf(" %d", i);}}
}

只得了19分有两个测试点答案错误,还有一个超时。但是不知道哪里错了。
后来看了这个博主的答案,发现可以用更加简便的方法查找所给的数是不是前面两个数的差,可以将所给的数x与容器中的每个数相加,看所得的结果是否能在容器中找到,如果可以且这个数之前在容器中没出现过,则这个数是正确的。

#include<cstdio>
#include<vector>
#include<unordered_set>
#include<algorithm>
using namespace std;
bool out[15];
bool vis[1000010];
int ans[15][1010];
unordered_set<int> num, lose;
int cnt = 0;
bool judge(int x)
{for(auto it = num.begin(); it != num.end(); it++){if(num.find(*it + x) != num.end())return false;}return true;
}//判断是否是前面任意两个数的差
int main()
{int a, b;scanf("%d%d", &a, &b);num.insert(a), num.insert(b);int n, m, res;scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)scanf("%d", &ans[i][j]);for(int j = 1; j <= m; j++){for(int i = 1; i <= n; i++){if(out[i] == true)continue;//该选手若淘汰了则跳过int res = ans[i][j];if(judge(res) || num.find(res) != num.end())//是否不是差且出现过{lose.insert(i);//只查找失败者的人数,如果等于n说明全部都失败了。printf("Round #%d: %d is out.\n", j, i);out[i] = true;//标记这个选手已经被淘汰过了}elsenum.insert(res);}}if(lose.size() == n)printf("No winner.");else{printf("Winner(s):");for(int i = 1; i <= n; i++){if(out[i] == false)//如果到最后这个选手都没有被淘汰,则说明这个选手赢了。printf(" %d", i);}}
}

7-4 Replacement Selection (30 分)

#include<queue>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
int n, m;
map<int, int> vis;
vector<int> num, old;
priority_queue<int, vector<int>, greater<int> > q;
int main()
{scanf("%d%d", &n, &m);old.resize(n);for(int i = 0; i < n; i++)scanf("%d", &old[i]);int round = 0;while(old.size() > 0){num = old;int maxn = -1, cnt = 0, pos = 0;while(pos < num.size()){if(q.size() < m && pos < num.size()){q.push(num[pos]);vis[num[pos]] = true;pos++;}else{if(cnt > 0) printf(" ");printf("%d", q.top());cnt++;q.pop();maxn = q.top();while(pos < num.size() && num[pos] < maxn)pos++;if(pos < num.size()){q.push(num[pos]);vis[num[pos]] = true;pos++;}}}while(q.size() > 0){if(cnt > 0) printf(" ");printf("%d", q.top());cnt++;q.pop();}old.clear();for(int i = 0; i < num.size(); i++)if(vis[num[i]] == false)old.push_back(num[i]);if(old.size() > 0)printf("\n");}return 0;
}
/*
7 3
81 94 11 96 12 99 35
*/

这个解法最后一个测试用例显示答案错误,扣了6分,不知道是什么原因。用两个容器循环还是复杂了点,接下来的解法则是将本轮要输出的数与下轮要输出的数分别用不同的容器存放,且q只用于将数据弹出。
然后参考了同一个博主的答案
用q来内部排序,用line存储本轮的数,v存储下轮的数,如果q为空,则表示本轮已经排序完成,将line中的数据全部输出。并将v的数放入q中再次进行内部排序,v中所有的数进行清除,开始下一轮排序。

#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int main() {int N, M;scanf("%d%d", &N, &M);vector<int> arr(N);for (int i = 0; i < N; i++) scanf("%d", &arr[i]);priority_queue<int, vector<int>, greater<int>> q;//模拟内存的排序,从小到大排列vector<int> v,line;//v存放下轮的数;line存放本轮的数int index = 0,count=0, last;for (; index < M; index++) q.push(arr[index]);while (count != N) {//如果从队列里出来的数小于Nlast = q.top();line.push_back(last);//根据有序性,每次列头的数会决定arr的下一个数去哪q.pop();count++;if (index < N) {//如果arr里还有数未处理if (arr[index] > last) q.push(arr[index++]);else v.push_back(arr[index++]);}if (q.empty()) {//当本轮的数已处理结束,即q为空for (int i = 0; i < line.size(); i++) {//输出lineif (i != 0) printf(" ");printf("%d", line[i]);}printf("\n");line.clear();for (int i = 0; i < v.size(); i++)//v的数全都放到q里q.push(v[i]);v.clear();}}
}

pat2020春季考试7-2 The Judger (25 分) 7-4 Replacement Selection (30 分)相关推荐

  1. 2019PAT春季考试第4题 7-4 Structure of a Binary Tree (30 分)

    题外话:考试的时候花了一个小时做了27分,由于Siblings这个单词不知道意思,所以剩下的3分就没去纠结了,后来发现单词是兄弟的意思,气哭~~ 这道题的麻烦之处在于如何从一个字符串中去找数字.先首先 ...

  2. 【PAT】2020年春季考试乙级题目、答案、摸鱼、游记、93分

    T1 对称日 (15分) 7-1 对称日 (15分) 央视新闻发了一条微博,指出 2020 年有个罕见的"对称日",即 2020 年 2 月 2 日,按照 年年年年月月日日 格式组 ...

  3. PAT-2022年春季考试 - 甲级题解

    试卷在此 7-1 Simple Lie Detection (20 分) 作者 陈越 单位 浙江大学 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB Lie detection ...

  4. 一级计算机考试题库25套答案,全国计算机等级考试一级试题及答案(25套)..doc

    全国计算机等级考试一级试题及答案(25套). 全国计算机等级考试一级试题及答案(25套) 一.选择题(每题1分,共20分) D (1)世界上第一台计算机诞生于哪一年? A)1945年 B)1956年 ...

  5. 广东9月计算机二级考试时间,2021年9月广东计算机等级考试时间:9月25日-27日

    [导语]从<2021年9月广东考区全国计算机等级考试报考简章>中获悉,2021年9月广东计算机等级考试时间定于9月25日-27日期间,具体安排及科目如下: 2021年9月(第62次)NCR ...

  6. Hadoop快速入门——入门考试(伪分布式60+编码25+执行jar15)

    Hadoop快速入门--入门考试(伪分布式60+编码25+执行jar15) 目录 一.伪分布式搭建(60分) 1.创建1台Linux虚拟机,并打开对应的网络连接(VMnet8)(5分) 2.通过xsh ...

  7. PAT-2021年春季考试-甲级

    ** PAT-2021年春季考试-甲级 7-3 structure of max-heap ** 对我个人来说,这道题的难点在于没能利用sscanf 以及 cin.get() 函数进行提问内容的读取 ...

  8. 2020年PAT甲级春季考试真题及答案

    1168 Prime Day The above picture is from Sina Weibo, showing May 23rd, 2019 as a very cool "Pri ...

  9. 上海新中考体育考试方案公布:总分30分不变

    在近几年来的全国体质健康监测中,申城中小学生及格率稳定在95%左右,优良率始终保持在40%以上,并逐年提升.然而,与此同时,和全国其他省市相比,耐力和力量项目是上海学生的两大短板.新方案增加了可选项目 ...

  10. 江苏计算机学业水平测试多少分过关,江苏学业水平测试2021年考试时间:合格性考试30分能过吗?...

    选择科目 测一测我能上哪些大学 选择科目 领取你的专属报告 > 选择省份 关闭 请选择科目 确定 v> 近日,江苏省2021年学业水平测试即将开始,江苏省教育考试院也公布了具体的考试安排和 ...

最新文章

  1. 至2019年全球Hadoop市场年复合增长率将达53%
  2. c语言1066字符分类统计,C语言字符串操作总结大全(超详细)
  3. 计算机二级各个科目的区别,计算机二级考试的各个科目的内容及区别.doc
  4. python变量定义必须赋值_Python3单行定义多个变量或赋值方法
  5. 极光IM初始化SDK出错
  6. asp.net mvc使用mysql_ASP.NET开发实战——(八)ASP.NET MVC 与数据库之MySQL
  7. 物联网部署的5个阶段
  8. 攀枝花a货翡翠,晋城a货翡翠
  9. Position属性四个值:static、fixed、absolute和relative的区别和用法
  10. struts2异常处理流程_Struts2异常处理示例教程
  11. OpenCV_ImageMatching with SURF and SIFT(使用SURF和 SIFT进行图像匹配 对比)
  12. wincc中c语言做变量自增,在WinCC中如何利用C动作实现变量自动加1-工业支持中心-西门子中国...
  13. 如何使用中文维基百科语料
  14. Dialog去掉默认白色背景
  15. 在html中加入高德地图,javascript高德地图放到网页中的方法
  16. 因为此版本的应用程序不支持其项目类型(.csproj),若要打开它,请使用支持此类型项目的版本
  17. 2023年JAVA JDK8的安装与配置(附JAVA8安装包)
  18. C语言里的和*的简单作用理解
  19. 数学计算软件(Matlab、Mathematica)网页版
  20. 前端 JS实现彩票开奖走势图 连线

热门文章

  1. 邮箱登陆时显示服务器连接失败,邮箱显示无法连接服务器
  2. mysql订单表和订单详情表_订单详情表,与,订单表 怎么做?
  3. 百度地图api-基本用法总结
  4. HanLP《自然语言处理入门》笔记--2.词典分词
  5. 范围求和 II-c语言解决
  6. Generative Adversarial Networks overview(1)
  7. 如何使用GoldWave中文版进行声道分离?
  8. 2013菏泽国际牡丹文化旅游节
  9. postman设置成中文
  10. 张学孟 (帮别人名字作诗)