题意:模拟Petri网的执行。虽然没听说过Petri网,但是题目描述的很清晰。


代码:(Accepted,0.210s)

//UVa804 - Petri Net Simulation
//Accepted 0.210s
//#define _XIENAOBAN_
#include<iostream>
#include<map>
using namespace std; struct {
map<int, int> ipt, opt;
} Trans[111]; int NP, NT, NF, Cnt, T(0);
int Token[111]; void IniAndInput() {
Cnt = 0;
for (int i(1);i <= NP;++i)
scanf("%d", Token + i);
scanf("%d", &NT);
for (int i(1);i <= NT;++i) {
Trans[i].ipt.clear();
Trans[i].opt.clear();
int n;
while (scanf("%d", &n) != EOF && n) {
if (n < 0) ++Trans[i].ipt[-n];
else ++Trans[i].opt[n];
}
}
scanf("%d", &NF);
} bool JudgeTrans(int i) {
for (auto& t : Trans[i].ipt)
if (Token[t.first] < t.second)
return false;
return true;
} bool TryTrans() {
for (int i(1);i <= NT;++i) {
if (!JudgeTrans(i)) continue;
for (auto& t : Trans[i].ipt)
Token[t.first] -= t.second;
for (auto& t : Trans[i].opt)
Token[t.first] += t.second;
return true;
}
return false;
} void Output() {
printf("Case %d: ", ++T);
if (Cnt < NF)
printf("dead after %d transitions\n", Cnt);
else printf("still live after %d transitions\n", NF);
printf("Places with tokens:");
for (int i(1);i <= NP;++i) if (Token[i])
printf(" %d (%d)", i, Token[i]);
printf("\n\n");
} void Debug() {
cerr << "\nToken:\n";
for (int i(1);i <= NP;++i) cerr << Token[i] << ' ';
cerr << "\nTrans:\n";
for (int i(1);i <= NT;++i) {
for (const auto& t : Trans[i].ipt) cerr << t.first << " - " << t.second << '\n';
for (const auto& t : Trans[i].opt) cerr << t.first << " + " << t.second << '\n';
}
} int main()
{
#ifdef _XIENAOBAN_
#define gets(T) gets_s(T, 129)
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif while (scanf("%d", &NP) != EOF && NP) {
IniAndInput();
//Debug();//
for (;Cnt < NF;++Cnt) {
if (!TryTrans()) break;
//Debug();//
}
Output();
}
return 0;
}

分析:其实就是无脑模拟。比前一题简单好多,有些意外。一遍通过,好久没一遍过了,好爽。题目描述的很清晰,看紫书的中文简述反而看不懂。这次尽量给不同部分分了个块,分到不同函数里去了,看着清晰点。210ms好像有点长,看网上别人的做法也基本类似,也不优化了。

说起来我一开始对每一个Case进行初始化Trans数组时,一开始选择的对整个数组的ipt、opt进行clear,用时190ms。后来改成只对要用的部分进行clear初始化,反而用时更长了(210ms)。这应该是处理器的优化的结果吧。就是让处理器反复干一件事时它会预测下一步还是这个同样的计算,就会处理的特别快。也算是硬件因素吧?

[刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation的更多相关文章

  1. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  2. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  3. [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A

    题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...

  4. [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...

  5. [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile

    题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...

  6. [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536

    这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...

  7. [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities

    题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...

  8. [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary

    题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...

  9. [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web

    题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...

随机推荐

  1. vue渐变淡入淡出轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. empty 语句

    empty 语句: 用来表明没有语句, 尽管JavaScript语法希望有语句会被执行. empty语句 用分号表示 (;) ,用来指明没有语句会被执行, 尽管此时JavaScript语法需要执行语句 ...

  3. 浅谈MVC缓存

    缓存是将信息放在内存中以避免频繁访问数据库从数据库中提取数据,在系统优化过程中,缓存是比较普遍的优化做法和见效比较快的做法. 对于MVC有Control缓存和Action缓存. 一.Control缓存 ...

  4. linux—粘滞位的设置

    粘滞位(Stickybit),或粘着位,是Unix文件系统权限的一个旗标.最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件.如果不为目录设置粘滞位,任 ...

  5. 图的基本算法(BFS和DFS)(转载)

    图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...

  6. ajax大洋第一步

    Ajax工具包 Ajax并不是一项新技术,它实际上是几种技术,每种技术各尽其职,以一种全新的方式聚合在一起. 服务器端语言:服务器需要具备向浏览器发送特定信息的能力.Ajax与服务器端语言无关. XM ...

  7. UTF-8 GBK UTF8 GB2312 之间的区别和关系

    UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...

  8. 学Java,是自学还是去培训班学习?

    现在正在读在校的最后一个学年,想毕业后从事编程,但是感觉自己技术太差,应该是培训呢?还是去找实习?亦或是有更好的途径? 对于 Android 目前的行业趋势,不知道自己该不该坚持?还是转其他行业? 已 ...

  9. USACO Section 1.1-3 Friday the Thirteenth

    Friday the Thirteenth 黑色星期五 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数. 给出N年的一个 ...

  10. 本学期微分方程数值解课程总结(matlab代码)

    最简单求解一个微分方程数值解得方法:Euler法 function [x,y]=Euler_method(dufun,span,h,x0,y0) %EuLer格式, %求解方程y'=dufun(x,y ...