• 2016"百度之星"


    Gym Class

    Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 681    Accepted Submission(s): 271


    Problem Description
    众所周知,度度熊喜欢各类体育活动。

    今天,它终于当上了梦寐以求的体育课老师。第一次课上,它发现一个有趣的事情。在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到N ,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为自己评价这堂课的分数。麻烦的是,有一些同学不希望某个(些)同学排在他(她)前面,在满足这个前提的情况下,新晋体育课老师——度度熊,希望最后的排队结果可以使得所有同学的评价分数和最大。
     
    Input
    第一行一个整数T ,表示T(1T30) 组数据。

    对于每组数据,第一行输入两个整数NM(1N100000,0M100000) ,分别表示总人数和某些同学的偏好。

    接下来M 行,每行两个整数AB(1A,BN) ,表示ID为A 的同学不希望ID为B 的同学排在他(她)之前。你可以认为题目保证至少有一种排列方法是符合所有要求的。
     
    Output
    对于每组数据,输出最大分数 。
     
    Sample Input
    3
    1 0
    2 1
    1 2
    3 1
    3 1
     
     
    Sample Output
    1
    2
    6
     
    Source
     
    题意:中文题面
     
    题解: 拓扑排序+优先队列
             两个姿势复习一遍
             注意代码中标记的wa点
     
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<queue>
     5 #include<stack>
     6 #include<vector>
     7 #include<map>
     8 #define ll __int64
     9 using namespace std;
    10 vector<int> mp[100005];
    11 int in[100005];
    12 int t;
    13 int ans[100005];
    14 int vis[100005]; 
    15 struct node
    16 {
    17     int x;
    18     friend bool operator < (node aa,node bb)
    19     {
    20         return aa.x<bb.x;
    21     }
    22 };
    23 priority_queue<node> p;
    24 int n,m,a,b;
    25 int main()
    26 {
    27     while(scanf("%d",&t)!=EOF)
    28     {
    29         for(int i=1;i<=t;i++)
    30         {
    31             scanf("%d %d",&n,&m);
    32             int jishu=1;
    33             struct node exm;
    34             memset(ans,0,sizeof(ans));
    35             for(int j=1;j<=n;j++)
    36             {
    37             mp[j].clear();
    38             in[j]=0;
    39             vis[j]=0;
    40             }
    41             for(int j=1;j<=m;j++)
    42             {
    43                 scanf("%d %d",&a,&b);
    44                 mp[a].push_back(b);
    45                 in[b]++;
    46             }
    47             for(int j=1;j<=n;j++)
    48             {
    49                 if(in[j]==0)
    50                 {
    51                     exm.x=j;
    52                     vis[j]=1;
    53                     p.push(exm);
    54                 }
    55             }
    56             while(!p.empty())
    57             {
    58                 exm=p.top();
    59                 ans[jishu++]=exm.x;
    60                 p.pop();
    61                 for(unsigned int j=0;j<mp[exm.x].size();j++)
    62                 {
    63                     if(--in[mp[exm.x][j]]==0&&vis[mp[exm.x][j]]==0)
    64                     {  
    65                         vis[mp[exm.x][j]]==1;
    66                         struct node ggggg;////wa点
    67                         ggggg.x=mp[exm.x][j];
    68                         p.push(ggggg);
    69                     }
    70                 }    
    71             }
    72             int minx=ans[1];
    73             ll gg=ans[1];
    74             for(int j=2;j<=n;j++)
    75             {
    76                 minx=min(minx,ans[j]);
    77                 gg+=minx; 
    78             } 
    79             printf("%I64d
    ",gg);    
    80         }
    81     }    
    82     return 0;
    83 } 
     
     
     
  • 相关阅读:
    选择排序
    快速排序
    希尔排序
    直接插入排序
    判断三角形的类型
    Unicode编码下: CString 转换为 string
    GDAL中GDALDataType中值与其在C++中数据类型对应
    ftell()
    fseek()
    fopen_s()
  • 原文地址:https://www.cnblogs.com/hsd-/p/5521396.html
Copyright © 2020-2023  润新知