DAG训练题 奥赛奖金
2016-07-08 16:44
232 查看
【问题描述】 | |
在2013年的NOIP复赛中,CQYZ高2015级信息学竞赛班的同学们以超强的实力,力压BS,NK,BZ等学校。学校大老板Mr.lu心情很好,决定给每位学生发奖金。并按每个人竞赛的成绩高低计算他们得到奖金的多少,成绩低的肯定要比成绩高的少,但奖金最少为100元。 但Mr.lu又是一个很@的人,想发出的奖金尽量的少,这让Mr.He很生气。决定给老板出点难题,不将每个同学的成绩直接给他,而是只告诉他:学生a的成绩比学生b的成绩高。这可难坏了财务室的那几爷子!请你来帮助她们。 注意:每人得到的奖金必须是整数元。 |
【输入格式】 | ||
第一行两个整数N,M,N表示学生总数;以下M行,每行2个整数a,b,表示学生a的竞赛成绩学生b高。注意,输入信息中不会出现a比b高,b比c高,c又比a高的情况。 |
【输出格式】 | ||
输出一个数表示最少总奖金。 |
【输入样例】 | ||
8 9 1 3 1 7 2 3 2 4 3 4 4 5 4 6 8 6 7 8 |
【输出样例】 | ||
812 |
【数据范围】 | ||
80%的数据满足n<=1000,m<=2000; 100%的数据满足n<=10000,m<=100000。 |
分别找到剩余的中分最低的学生,获得指向他的人多1的奖金。
最后加起来。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define maxn 10005
using namespace std;
int n,m,x,y,ans=0;
int rd[maxn]={0},s[maxn];
vector<int>g[maxn];
vector<int>topo;
void fuck()
{
queue<int>q;
for(int i=1;i<=n;i++)
if(rd[i]==0) q.push(i),s[i]=100;//i入度为0,说明没有人比i更低
while(!q.empty())
{
int i=q.front();
q.pop();
for(int j=0;j<g[i].size();j++)
{
int k=g[i][j];
if(rd[k]>0) rd[k]--;
if(rd[k]==0) q.push(k);
s[k]=s[i]+1;
//经rd==0的排除,k是i之后分最低的
}
}
for(int i=1;i<=n;i++)
ans+=s[i];
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
g[y].push_back(x);
//由分低的指向高的
rd[x]++;
}
fuck();
printf("%d",ans);
}
细心的人会发现没有retrun 0;
相关文章推荐
- linux内核启动第二阶段分析 start_kernel
- UILabel attributedText的一个坑
- 解决有 sql中 &XXX 插入数据的时候弹出提示框输入内容
- android布局--fill_parent、wrap_content和match_parent的区别
- 一个程序员的自白
- Linux里Oracle client客户端简便安装
- iOS安全系列之一:HTTPS
- Js回调示例
- 关于android传感器中的一些名词
- pyqt4学习之一:搭建环境和入门
- GTID:传统复制向GTID迁移
- Java下利用Jackson进行Json的转化解析
- 洛谷P1598 垂直柱状图
- 在一个元素个数为N的数组里,找到升序排在N/5位置的元素的最优算法时间复杂度是----阿里巴巴2015实习生笔试题
- poi导出Excel 属性的设置篇
- 【那些年遇到过的面试题】grep和find的区别
- NTFS文件系统-MFT属性体
- 服务器推送之WebSocket 入门学习路程(一)
- 百度地图API删除指定marker
- 泛型算法