奖金(信息学奥赛一本通-T1352)
生活随笔
收集整理的這篇文章主要介紹了
奖金(信息学奥赛一本通-T1352)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
由于無敵的凡凡在2005年世界英俊帥氣男總決選中勝出,Yali Company總經理Mr.Z心情好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻為標準來計算他們得到獎金的多少。
于是Mr.Z下令召開m方會談。每位參加會談的代表提出了自己的意見:“我認為員工a的獎金應該比b高!”Mr.Z決定要找出一種獎金方案,滿足各位代表的意見,且同時使得總獎金數最少。每位員工獎金最少為100元。
【輸入】
第一行兩個整數n,m,表示員工總數和代表數;
以下m行,每行2個整數a,b,表示某個代表認為第a號員工獎金應該比第b號員工高。
【輸出】
若無法找到合理方案,則輸出“Poor Xed”;否則輸出一個數表示最少總獎金。
【輸入樣例】
2 1
1 2
【輸出樣例】
201
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #include<set> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 100001 #define MOD 123 #define E 1e-6 using namespace std; int n,m; int head[N],side[N]; int f[N],q[N]; int vis[N]; int cnt; struct node{int pre;int next; }a[N]; void add_edge(int x,int y) {cnt++;a[cnt].pre=y;a[cnt].next=head[x];head[x]=cnt; } void topsort(int x) {int headd=1,tail=1;vis[x]=1;q[tail]=x;tail++;while(headd<tail){int u=q[headd];for(int b=head[u];b;b=a[b].next){int v=a[b].pre;side[v]--;f[v]=max(f[v],f[u]+1);if(side[v]==0){q[tail]=v;tail++;vis[v]=1;}}headd++;} } int main() {int sum=0;cin>>n>>m;for(int i=1;i<=n;i++)f[i]=100;for(int i=1;i<=m;i++){int x,y;cin>>y>>x;add_edge(x,y);side[y]++;}for(int i=1;i<=n;i++)if(!vis[i]&&!side[i])topsort(i);for(int i=1;i<=n;i++)if(!vis[i]){cout<<"Poor Xed"<<endl;return 0;}for(int i=1;i<=n;i++)sum+=f[i];cout<<sum<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的奖金(信息学奥赛一本通-T1352)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菲波那契数列(信息学奥赛一本通-T118
- 下一篇: 基础算法 —— 高精度计算 —— 高精度