1352:【例4-13】奖金

【题目描述】

由于无敌的凡凡在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

【提示】

【数据规模】

80%的数据满足:n≤1000,m≤2000;

100%的数据满足:n≤10000,m≤20000。

 

这题要注意的是开数组的时候是开到题目要求的要不然会报运行错误

还有一题就是a比b高那么就是b->a这个意思,在b的基础上+1会使总奖金数最少

然后就是套用扩扑排序的模板了

代码写认真点

#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int>p[20005];
int pay[20005];
int indeg[20005];

bool topsort()
{
    queue<int>Q;
    for(int i=1;i<=n;i++) if(!indeg[i]) Q.push(i);
    int num=0;
    while(!Q.empty()){
        int u=Q.front();
        Q.pop();
        num++;
        for(int i=0;i<p[u].size();i++){
            if(--indeg[p[u][i]]==0){
               Q.push(p[u][i]);
            }
            pay[p[u][i]]=max(pay[u]+1,pay[p[u][i]]);

        }
    }
    if(n==num) return true;
    else return false;

}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++){
        pay[i]=100;
    }
    memset(indeg,0,sizeof(indeg));
    int x,y;
    for(int i=0;i<m;i++){
        scanf("%d %d",&x,&y);
        p[y].push_back(x);
        indeg[x]++;
    }

    int sum=0;
    if(topsort()){
        for(int i=1;i<=n;i++){
            sum+=pay[i];
        }
        printf("%d\n",sum);

    }
    else printf("Poor Xed\n");
    return 0;
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值