• bzoj:1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名


    Description

        农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序.    约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他发现,他还需要再做一张关于另外C对奶牛的产奶率比较,才能推断出所有奶牛的产奶率排序.请帮他确定C的最小值.

    Input

        第1行包含两个用空格分开的整数N和M.接下来M行,每行有两个用空格分开的整数X和Y(1≤X,y≤1000),表示奶牛X的产奶率高于奶牛Y.

    Output

     
      C的最小值.

    Sample Input

    5 5
    2 1
    1 5
    2 3
    1 4
    3 4

    INPUT DETAILS:

    FJ is comparing 5 cows and has already determined that cow 2 > cow
    1, cow 1 > cow 5, cow 2 > cow 3, cow 1 > cow 4, and cow 3 > cow 4
    (where the '>' notation means "produces milk more quickly").

    Sample Output

    3
     
    答案为排名无序的点对个数……
    然后就总点对-排名有序点对数咯。
    #include<bitset>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int read_p,read_ca,read_f;
    inline int read(){
        read_p=0;read_ca=getchar();read_f=1;
        while(read_ca<'0'||read_ca>'9') read_f=read_ca=='-'?-1:read_f,read_ca=getchar();
        while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
        return read_p*read_f;
    }
    
    int n,m,mmh,x,y;
    bool bo[1000];
    bitset <1000> b[1000];
    void dfs(int x){
        if (bo[x]) return;bo[x]=1;
        for (int i=0;i<n;i++)
        if (b[x][i]) dfs(i),b[x]|=b[i];
    }
    int main(){
        register int i;
        n=read();m=read();mmh=(n*(n-1))>>1;
        for (i=1;i<=m;i++) x=read()-1,y=read()-1,b[x][y]=1;
        for (i=0;i<n;i++) dfs(i),mmh-=b[i].count();
        printf("%d
    ",mmh);
    }
    948 kb 104 ms C++/Edit 796 B
  • 相关阅读:
    spring 配置版本问题
    sublime与Emment
    工欲善其事必先利其器之浏览器篇
    工欲善其事必先利其器之windows篇
    工欲善其事必先利其器之搜索引擎
    营销自我
    java必备技能
    离线安装ADT和sdk
    eclipse的小技巧
    匿名内部类
  • 原文地址:https://www.cnblogs.com/Enceladus/p/6098938.html
Copyright © 2020-2023  润新知