2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(HDU5695)——贪心+拓扑排序

  分析:首先,利用贪心可知,如果要所有人的分数和最高,需要把序号大的优先放在前面。其次,对于a的前面不能为b,那么只能a在b前面了,那么就建立一条从a到b的边,并且b的入度加1。然后就是拓扑排序了。要分数最高,则把哪些入度为0的点(他们不需要有哪些人一定要在他们前面,最自由)丢进优先队列,然后就可以实现把序号大的尽量放在前面而且满足题意了。

  具体见代码:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <vector>
 5 #include <queue>
 6 using namespace std;
 7 typedef long long ll;
 8
 9 vector<int> G[100000+5];
10 int in[100000+5],val[100000+5];
11 int n,m;
12 void solve()
13 {
14     int sit=1;
15     priority_queue<int> Q;
16     for(int i=1;i<=n;i++) if(!in[i]) Q.push(i);
17     while(!Q.empty())
18     {
19         int x=Q.top();Q.pop();
20         val[sit++]=x;
21         for(int i=0;i<G[x].size();i++)
22         {
23             int v = G[x][i];
24             in[v]--;
25             if(!in[v]) Q.push(v);
26         }
27     }
28 }
29 int main()
30 {
31     int T;
32     scanf("%d",&T);
33     while(T--)
34     {
35         scanf("%d%d",&n,&m);
36         for(int i=1;i<=n;i++) G[i] .clear();
37         memset(in,0,sizeof(in));
38         memset(val,0,sizeof(val));
39         while(m--)
40         {
41             int u,v;
42             scanf("%d%d",&u,&v);
43             G[u].push_back(v);
44             in[v]++;
45         }
46         solve();
47         int minn=100000+5;
48         ll ans=0;
49         for(int i=1;i<=n;i++)
50         {
51             minn=min(minn,val[i]);
52             ans+=(ll)minn;
53         }
54         printf("%I64d\n",ans);
55     }
56     return 0;
57 }

  

时间: 2024-08-03 22:51:20

2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(HDU5695)——贪心+拓扑排序的相关文章

2016百度之星-初赛(Astar Round2A)AII X

Problem Description F(x,m) 代表一个全是由数字x组成的m位数字.请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据. 每组测试数据占一行,包含四个数字x,m,k,c 1≤x≤9 1≤m≤10^10 0≤c<k≤10,000 Output 对于每组数据,输出两行: 第一行输出:"Case #i:".i代表第i组测试数据. 第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式.

Hdu 5696 区间价值(2016百度之星初赛Astar Round2B )(线段树)

思路来源于:http://blog.csdn.net/kk303/article/details/51479423 注意数组用 long long 存,否则WA. /* Problem : Status : By wf, */ #include "algorithm" #include "iostream" #include "cstring" #include "cstdio" #include "string&q

2016&quot;百度之星&quot; - 初赛(Astar Round2A)解题报告

此文章可以使用目录功能哟↑(点击上方[+]) 有点智商捉急,第一题卡了好久,看来不服老,不服笨是不行的了...以下是本人目前的题解,有什么疑问欢迎提出 链接→2016"百度之星" - 初赛(Astar Round2A)  Problem 1001 All X Accept: 0    Submit: 0 Time Limit: 2000/1000 mSec(Java/Others)    Memory Limit : 65536 KB  Problem Description F(x,

HDU 5701 中位数计数( 2016&quot;百度之星&quot; - 初赛(Astar Round2B) 思维 + 暴力)

传送门 中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 852 Accepted Submission(s): 335 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含

HDU 5698 瞬间移动 (2016&quot;百度之星&quot; - 初赛(Astar Round2B) 1003)

传送门 瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 140 Accepted Submission(s): 66 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案

2016&quot;百度之星&quot; - 初赛(Astar Round2A) 1006 Gym Class 拓扑排序

Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 众所周知,度度熊喜欢各类体育活动. 今天,它终于当上了梦寐以求的体育课老师.第一次课上,它发现一个有趣的事情.在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到NN,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为自己评价这堂课的分

2016&quot;百度之星&quot; - 初赛(Astar Round2A) 1004 D Game 区间DP

D Game Problem Description 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它发明了一个游戏:D游戏. 度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只是代指等差数列[(等差数列百科)](http://baike.baidu.com/view/62268.htm)中的公差D. 这个游戏是这样的,首先度度熊拥有一个公差集合{D},然后它依次写下N个数字排成一行.游戏规则很简单: 1. 在当前剩下的有序数组中选择X(X≥2) 个连续数字: 2. 检查1选择

2016&quot;百度之星&quot; - 初赛(Astar Round2A)--HDU 5690 |数学转化+快速幂

Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69 Sample Output Case #1: No Case #2: Yes Case #3: Yes Hint 对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是"No",而第二组测试数据中满足如上公式,所以答案是 "Yes". 解: m个x组成的数可以表示为x*(1+10+10^2+...+10^m-1)=x*(10^m-1)/9; 即x*(10^m-1)/9%

2016&quot;百度之星&quot; - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP

Sitting in Line Problem Description 度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十分简单,参与游戏的N个整数将会做成一排,他们将通过不断交换自己的位置,最终达到所有相邻两数乘积的和最大的目的,参与游戏的数字有整数也有负数.度度熊为了在他的数字仆人面前展现他的权威,他规定某些数字只能在坐固定的位置上,没有被度度熊限制的数字则可以自由地交换位置. Input 第一行一个整数T,表示T组数