拓扑排序 codevs 4040 cojs 438
2016-06-05 09:10
483 查看
codevs 4040 EZ系列之奖金
时间限制: 1 s空间限制: 64000 KB
题目等级 : 钻石 Diamond
题目描述 Description
由于无敌的WRN在2015年世界英俊帅气男总决选中胜出,EZ总经理Mr.Lin心情好,决定给每位员工发奖金。EZ决定以每个人本年在EZ的贡献为标准来计算他们得到奖金的多少。
于是Mr.Lin下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为学生a的奖金应该比b高!”Mr.Lin决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位学生奖金最少为100元。
输入描述 Input Description
第一行两个整数n,m,表示学生总数和代表数;
以下m行,每行2个整数a,b,表示某个代表认为第a号学生奖金应该比第b号学生高。
输出描述 Output Description
若无法找到合法方案,则输出“-1”;否则输出一个数表示最少总奖金。
样例输入 Sample Input
2 1
1 2
样例输出 Sample Output
201
数据范围及提示 Data Size & Hint
80%的数据满足n<=1000,m<=2000;
100%的数据满足n<=10000,m<=20000。
#include<iostream> #define inf (1<<31)-1 using namespace std; #include<cstdio> typedef long long ll; #include<cstring> #define N 10010 #include<stack> stack<int>sta; struct Edge{ int v,last; }edge[N<<1]; ll ans=0; int indu ,head ,t=0,u,tot=0,v,n,m; void add_edge(int u,int v) { ++t; edge[t].v=v; edge[t].last=head[u]; head[u]=t; } int read() { int sum=0,ff=1;char s; s=getchar(); while(s<'0'||s>'9') { if(s=='-') ff=-1; s=getchar(); } while('0'<=s&&s<='9') { sum=sum*10+s-'0'; s=getchar(); } return sum*ff; } void input() { n=read();m=read(); for(int i=1;i<=m;++i) { v=read();u=read(); add_edge(u,v); indu[v]++; } } bool toposort() { int mon=0; while(tot<n) { for(int i=1;i<=n;++i) { if(!indu[i]) { ans+=100+mon; sta.push(i); indu[i]=inf; tot++; } } if(sta.empty()) return false; while(!sta.empty()) { int topt=sta.top(); sta.pop(); for(int l=head[topt];l;l=edge[l].last) { indu[edge[l].v]--; } } mon++; } return true; } int main() { input(); if(toposort()) { cout<<ans<<endl; } else printf("-1\n"); return 0; }
cojs 438. 烦人的幻灯片
★☆ 输入文件:slides.in输出文件:
slides.out简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
李教授将于今天下午作一次非常重要的演讲。不幸的是他不是一个非常爱整洁的人,他把自己演讲要用的幻灯片随便堆在了一起。因此,演讲之前他不得不去整理这些幻灯片。做为一个讲求效率的学者,他希望尽可能简单地完成它。教授这次演讲一共要用n张幻灯片(n≤26),这n张幻灯片按照演讲要使用的顺序已经用数字l,2,…,n在上面编了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。
现在我们用大写字母A,B,C,…再次把幻灯片依次编号。你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是惟一的;若是出现多种对应的情况或是某些数字编号和字母编号对应不起来,我们就称对应是无法实现的。
【输入格式】
幻灯片的情况通过一个文本文件slides.in输入。
文件的第1行只有一个整数n,表示有n张幻灯片,接下来的n行每行包括4个整数Xmin,Xmax,Ymin,Ymax(整数之间用空格分开)为幻灯片的坐标,这n张幻灯片按其在输入文件中出现的顺序从前到后依次编号为A,B,C,…
再接下来的n行依次为n个数字编号的坐标x,y,显然在幻灯片之外是不会有数字的。
【输出格式】
要求将程序的运行结果写入一个名为slides.out的文本文件。若是对应可以实现,输出文件应该包括n行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第1行顶格输出None即可。行首行末并无多余的空格。
【输入输出样例】
输 入
4
6 22 10 20
4 18 6 16
8 20 2 18
10 24 4 8
9 15
19 17
11 7
21 11
输 出
A 4
B 1
C 2
D 3
这道题目类似于拓扑排序的思想:
#define N 30 #include<vector> #include<iostream> using namespace std; #include<cstdio> #include<algorithm> struct Edge{ int u; vector<int>a; bool operator <(const Edge&p) const{return a.size()<p.a.size();} }bh ; struct Kp{ int x1,x2,y1,y2; }kp ; int flag ,t=0,tot=0,n; void input() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d%d%d%d",&kp[i].x1,&kp[i].x2,&kp[i].y1,&kp[i].y2); } // memset(flag,0,sizeof(flag)); } void add_edge(int u,int v) { bh[u].u=u; bh[u].a.push_back(v); } void add() { int xi,xa,yi,ya; for(int i=1;i<=n;++i) { scanf("%d%d",&xi,&yi); for(int j=1;j<=n;++j) { if(xi>=kp[j].x1&&xi<=kp[j].x2&&yi>=kp[j].y1&&yi<=kp[j].y2) { add_edge(i,j); } } } } int main() { freopen("slides.in","r",stdin); freopen("slides.out","w",stdout); input(); add(); sort(bh+1,bh+n+1); for(int i=1;i<=n;++i) { for(int j=0;j<bh[i].a.size();++j) { if(flag[bh[i].a[j]]==0) { int temp=bh[i].a[j]; flag[bh[i].a[j]]=bh[i].u; tot++; break; } } } int tbflag ={0}; for(int i=1;i<=n;++i) { for(int j=bh[i].a.size()-1;j>=0;--j) { if(tbflag[bh[i].a[j]]==0) { int temp=bh[i].a[j]; tbflag[bh[i].a[j]]=bh[i].u; break; } } } bool fla=true; for(int i=1;i<=n;++i)/*再反着做一次,是确保结果唯一的*/ { if(tbflag[i]!=flag[i]) { fla=false;break; } } if(tot==n&&fla) { for(int i=1;i<=n;++i) { printf("%c %d\n",i+'A'-1,flag[i]); } } else { printf("None\n"); } fclose(stdin);fclose(stdout); return 0; }
相关文章推荐
- 分享javascript实现的冒泡排序代码并优化
- 12个非常实用的JavaScript小技巧
- JavaScript作用域
- JavaScript中的hosting机制
- JSF使用注解的时候
- 正则表达式、分组、子匹配(子模式)、非捕获子匹配(子模式)
- 正则表达式性能优化方法(高效正则表达式书写)
- Gson 与 fastJson 在使用上的差异(fastJson的优点)
- JS里的方法重载
- 分享javascript实现的冒泡排序代码并优化
- 使用three.js 画渐变的直线
- JavaScript 数组中最大最小值
- JSON转换工具包收集
- JavaScript中的一些特殊用法(一)
- 玩转JavaScript OOP[0]——基础类型
- 玩转JavaScript OOP[0]——基础类型
- Jsoup.connect(url).get()解析html页面空格&bsp乱码问题
- Jsoup实现新闻网页的爬取,标题,正文,图片,新闻时间,网页链接的解析示例
- JavaScript快速学习
- 两款JSON类库Jackson与JSON-lib的性能对比