zoukankan      html  css  js  c++  java
  • hdu-5695 Gym Class(贪心+拓扑排序)

    题目链接:

    Gym Class

    Time Limit: 6000/1000 MS (Java/Others)   

     Memory Limit: 65536/65536 K (Java/Others)


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

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

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

    接下来M行,每行两个整数A 和B(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
     
     
    题意:
     
     
    思路:
     
    涉及到先后问题就是拓扑序,而这个的拓扑序不止一种,而且要求最后的和最大,贪心知道要使ID值大的尽量排在前边,所以拓扑排序时用优先队列维护;
     
     
    AC代码:
    //#include <bits/stdc++.h>
    
    #include <iostream>
    #include <queue>
    #include <cmath>
    #include <map>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    
    using namespace std;
    #define Riep(n) for(int i=1;i<=n;i++)
    #define Riop(n) for(int i=0;i<n;i++)
    #define Rjep(n) for(int j=1;j<=n;j++)
    #define Rjop(n) for(int j=0;j<n;j++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    typedef long long LL;
    //const LL mod=1e9+7;
    const double PI=acos(-1.0);
    const int inf=0x3f3f3f3f;
    const int N=1e5+25;
    int n,m,ind[N],vis[N],b[N];
    vector<int>ve[N];
    priority_queue<int>qu;
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            Riep(n)ve[i].clear(),vis[i]=0;
            int x,y;
            Riep(m)
            {
                scanf("%d%d",&x,&y);
                ve[x].push_back(y);
                ind[y]++;
            }
            for(int i=1;i<=n;i++)
            {
                if(!ind[i])
                {
                    qu.push(i);
                    vis[i]=1;
                }
            }
            int cnt=0;
            while(!qu.empty())
            {
                int fr=qu.top();
                b[cnt++]=fr;
                qu.pop();
                int len=ve[fr].size();
                for(int i=0;i<len;i++)
                {
                    int y=ve[fr][i];
                    ind[y]--;
                    if(!ind[y]&&!vis[y])
                    {
                        qu.push(y);
                        vis[y]=1;
                    }
                }
            }
            LL sum=0;
            int mmin=2e5;
            for(int i=0;i<n;i++)
            {
                if(mmin>b[i])
                {
                    mmin=b[i];
                }
                sum=sum+mmin;
            }
            printf("%I64d
    ",sum);
        }
        return 0;
    }
     
  • 相关阅读:
    二:数组去重
    一:JS 数组对象根据相同key合并成新的数组对象(将一维数组转为多维数组)
    滑动scroll没有效果
    品字布局占满全屏
    js计算器
    html样式初始化
    js计算器
    js邮箱验证
    js菱形
    js实现金字塔图形
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5515273.html
Copyright © 2011-2022 走看看