CSP消息传递接口201903-4 从30分到AC 掉坑反思

  • CSP201903-4
    • 题目描述
    • 错误原因
    • 思路
    • 库函数的使用
    • 代码一
    • 代码二

CSP201903-4

题目描述

原题传送

这道题我在30卡了好久,然后想起同学提醒他用ios :: sync_with_ stdio(false) 踩过坑,于是我就把它注释掉了,然后莫名其妙就40分了,然后一直卡在四十,离撞墙就差那么一点点,吃了三个面包补充我的多巴胺,结果碳水吃多了好困。

错误原因

最后发现,错是错在对于每次一次的代码,非空队列没有pop!!

for (int k = 0; k < n; k++){if (!q[k].empty()){flag = false;while (!q[k].empty())q[k].pop();}}

这段代码真的是重要得不得了啊!!!因为要输入T次n个进程的操作,如果一次代码输入结束之后没有将非空队列pop()空,就会影响下一次的代码输入。
还有一个地方要注意是对队列取front()之前,一定要注意队列是否为空,不然容易掉坑里

思路

我的思路有两种,考虑到这里的命令有先进先出的特点,两种方式都是先把各个进程对应的命令存在队列里,构造队列数组。
一种简单粗暴,就是去找当前进程的命令的目标进程队列里的队首命令是否与之匹配,不匹配那这个进程就卡住了,那就等待,就去进行下一个进程。如果匹配就把两个命令pop(),然后要去检查目标进程是否能继续往下推进。因为有可能目标进程之前在等待这个命令,后续的命令都没有往下推进,而与之配对的进程已经来查看过了,不会再来了,所以这个时候就需要这个进程主动去找来检查过的配对进程。
第二种就是看有没有形成环。相当于把命令的发送接受看成一条链,当访问到空队列或者是已经访问过的队列就说明形成了环。网上好像很多大佬都是这样写的,就不做赘述了。
下面是讲得一些很详细的链接
链接:
很详细的一篇.
用的第二种方法.

库函数的使用

有的函数太久不用都有点忘了。用好库函数事半功倍,用错就欲哭还休。
做的时候就忘了substr的用法,记成了第二参数是字符串的末尾位置,结果输出些妖魔鬼怪,调试了好一会才发现是substr的问题。
stringvar.substr(start [, length ]):
stringvar是要提取子字符串的字符串文字或 String 对象。
start
必选项。所需的子字符串的起始位置。字符串中的第一个字符的索引为 0。length
可选项。在返回的子字符串中应包括的字符个数。
说明
如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到 stringvar 的最后。
参考
字符串转数字stoi
参考

代码一

#include<iostream>
#include<queue>
#include<string>
using namespace std;
const int maxn = 1e4 + 50;
bool flag;
struct task
{char type;int des;
};
queue<task> q[maxn];void search(int m)
{task tt;task destt;while (!q[m].empty()){tt = q[m].front();if(!q[tt.des].empty())destt = q[tt.des].front();else{flag = false;//一定不能少,少了就少10分break;}if (tt.type + destt.type == 'S' + 'R'&&m==destt.des){q[m].pop();q[tt.des].pop();int index = tt.des;if (!q[index].empty()){search(index);}}else{break;}}
}
int main()
{//ios::sync_with_stdio(false);int T, n;//cin >> T >> n;scanf("%d%d", &T, &n);getchar();//for (int i = 0; i < T; i++){//bool flag = true;flag = true;for (int j = 0; j < n; j++){string s;getline(cin, s);//cout<<s<<endl;int pos = -1;int size = s.size();int k = 0, begin = 0;for (k = 0; k < size; k++){pos = s.find(" ", begin);if (pos == -1)break;//cout<<pos<<endl;string sub = s.substr(begin, pos - begin);//  cout<<sub<<endl;task t;t.type = sub[0];t.des = stoi(sub.substr(1, sub.size() - 1));q[j].push(t);begin = pos + 1;//cout<<begin<<endl;}if (k < size){string sub = s.substr(begin, pos - begin);task t;t.type = sub[0];// cout<<sub;t.des = stoi(sub.substr(1, sub.size() - 1));q[j].push(t);}}for (int m = 0; m < n; m++){if(!q[m].empty())search(m);}for (int k = 0; k < n; k++){if (!q[k].empty()){flag = false;while (!q[k].empty())q[k].pop();}}if (flag){cout << 0 << endl;}else{cout << 1 << endl;}}
}

代码二

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
using namespace std;
const int maxn = 1e4 + 50;
int T,n;
struct task
{char type;int des;
};
queue<task> q[maxn];
int vis[maxn];void search()
{bool flag=true;while(flag){flag=0;memset(vis,0,sizeof(vis));int pre=0;while(pre<n&&q[pre].empty())pre++;if(pre==n)break;vis[pre]=1;int next=q[pre].front().des;while(!vis[next]&&!q[next].empty()){vis[next]=1;task prett=q[pre].front();task nextt=q[next].front();if(prett.type+nextt.type=='S'+'R'&&pre==nextt.des){flag=1;q[pre].pop();q[next].pop();break;}pre=next;next=nextt.des;}}int mark = 0;for (int k = 0; k < n; k++) {if (!q[k].empty()) {mark = 1;while (!q[k].empty()) q[k].pop();}}printf("%d\n", mark);
}int main()
{//ios::sync_with_stdio(false);//int T, n;cin >> T >> n;getchar();//for (int i = 0; i < T; i++){for (int j = 0; j < n; j++){string s;getline(cin, s);//getchar();//cout<<s<<endl;int pos = -1;int size = s.size();int k = 0, begin = 0;for (k = 0; k < size; k++){pos = s.find(" ", begin);if (pos == -1)break;//cout<<pos<<endl;string sub = s.substr(begin, pos - begin);//   cout<<sub<<endl;task t;t.type = sub[0];t.des = stoi(sub.substr(1, sub.size() - 1));q[j].push(t);begin = pos + 1;//cout<<begin<<endl;}if (k < size){string sub = s.substr(begin, pos - begin);task t;t.type = sub[0];// cout<<sub;t.des = stoi(sub.substr(1, sub.size() - 1));q[j].push(t);}}search();}
}

CSP201903-4消息传递接口 从30分到AC 反思日记相关推荐

  1. CCF201903-4 消息传递接口(100分)【模拟】

    试题编号: 201903-4 试题名称: 消息传递接口 时间限制: 1.0s 内存限制: 512.0MB 问题链接:CCF201903-4 消息传递接口 问题简述:(略) 问题分析:模拟题,比较费时间 ...

  2. 7-6 实现图形接口及多态性 (30 分)

    ** 7-6 实现图形接口及多态性 (30 分) ** 编写程序,使用接口及类实现多态性,类图结构如下所示: 其中: GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法: C ...

  3. 输出月份英文名java_输出月份英文名 (30 分)

    6-2 输出月份英文名 (30 分) 本题要求实现函数,可以返回一个给定月份的英文名称. 函数接口定义: char *getmonth( int n ); 函数getmonth应返回存储了n对应的月份 ...

  4. 6-30 Read Esc Chars (30分)(函数)

    6-30 Read Esc Chars (30分)(函数) Esc characters are represented as \x in C string, such as \n and \t. F ...

  5. 6-1 微信名片类 (30 分)

    6-1 微信名片类 (30 分) 编码实现微信名片类WeChat,其中有属性number(微信号,String类型)和nickname(昵称,String类型),重写Object类的equals和to ...

  6. 3分和30分文章差距在哪里?

    好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅. 今天我们抛开实验设计.方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪里? 以2017年8月25日发表在Sci ...

  7. 微生物组:3分和30分文章差距在哪里?

    好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅. 今天我们抛开实验设计.方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪里? 以2017年8月25日发表在Sci ...

  8. PAT甲级1038 Recover the Smallest Number (30 分):[C++题解]贪心、排列成最小的数、字符串

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 贪心: 对于字符串a和b,如果 a+b < b+a (这里+代表字符串中的连接)代表字典序更小.举例 a = 321 , b ...

  9. PAT甲级1147 Heaps (30 分):[C++题解]堆、树的遍历、dfs、完全二叉树建树

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:给定完全二叉树,判断是否是堆,需要区分大根堆,小根堆.后面是输出后序遍历. AC代码 #include<bits/stdc++. ...

最新文章

  1. unsupported operand type(s) for + NoneType and int
  2. 国产期刊崛起!上海大学、郑州大学主办期刊IF超15,2021版SCI期刊影响因子出炉...
  3. Tomcat 集群问题
  4. 一款让你“乐词不疲”的背单词神器
  5. docker入门之容器网络
  6. 休眠锁定模式–乐观锁定模式如何工作
  7. 光端机和收发器的区别有哪些?
  8. 悦虎144固件,华强北二代悦虎144固件,1562M芯片144固件
  9. python中itsdangerous模块
  10. Container 布局容器
  11. 968. 监控二叉树(JavaScript)
  12. “产品助理最重要的工作是 Android 版本的设计与测试”
  13. CSS 3的display:盒类型详解
  14. 【图像几何】基于matlab GUI插值图像运算【含Matlab源码 850期】
  15. c语言鼠标游戏代码,自己用C写的一个简单的打地鼠游戏代码出了个问题(鼠标和循环不能...
  16. [Mysql]InnoDB数据页结构(掘金小册阅读笔记)
  17. OA系统中的任务管理
  18. Image Segmentation
  19. 计算机免费取名,电脑免费婴儿取名
  20. 雅虎股东紧盯阿里巴巴IPO蛋糕

热门文章

  1. 漫画图解进程与线程,形象生动
  2. 6.django笔记之orm
  3. python中的map:将一个列表作为定义域映射函数到对的值域中
  4. QTS公司将在芝加哥开通运营数据中心
  5. 正则表达式:pattern=[^\\w]---------总结------------
  6. 远程控制软件TeamViewer的替代解决方案——AnyDesk
  7. C++作业:乘法口算练习
  8. adim计算机管理员账号,win10怎样开启administrator管理员账户
  9. 使用CD74HC4067制作16颗的流水灯
  10. 代码实现添加联系人——Vcard