• bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序


    Description

    农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动。因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序。每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同。在排序过程中,JOHN 可以交换任意两头牛的位置。因为脾气大的牛不好移动,JOHN需要X+Y秒来交换脾气值为X和Y的两头牛。 请帮JOHN计算把所有牛排好序的最短时间。

    Input

    第1行: 一个数, N。

    第2~N+1行: 每行一个数,第i+1行是第i头牛的脾气值。

    Output

    第1行: 一个数,把所有牛排好序的最短时间。

    Sample Input

    3
    2
    3
    1

    输入解释:

    队列里有三头牛,脾气分别为 2,3, 1。

    Sample Output

    7

    输出解释:
    2 3 1 : 初始序列
    2 1 3 : 交换脾气为3和1的牛(时间=1+3=4).
    1 2 3 : 交换脾气为1和2的牛(时间=2+1=3).
    —————————————————————————————————
    将每个点和他的目标点连起来之后我们发现会形成一个个环
    那么环内如果自己交换的话 因为每次只能使一个到位 所以至少是环的大小(k)-1次
    那么我们用环内的最小值mn去交换必然是最优的
    当然也可能是那环外的一个点来换更优 这个时候他要多换入和换出两个操作
    计算一下代价求最小就行了
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int M=10007;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n,v[M],s[M],vis[M],ans;
    void mins(int &x,int y){if(y<x) x=y;}
    int min(int x,int y){return x<y?x:y;}
    int main(){
        n=read();
        for(int i=1;i<=n;i++) v[i]=s[i]=read();
        sort(s+1,s+1+n);
        for(int i=1;i<=n;i++)if(!vis[i]){
            int mn=v[i],sum=v[i],now=i,h=1;
            while(1){
                vis[now=lower_bound(s+1,s+1+n,v[now])-s]=1;
                if(now==i) break;
                h++; mins(mn,v[now]);
                sum+=v[now];
            }
            ans=ans+min((sum-mn)+(h-1)*mn,(s[1]+mn)*2+(sum-mn)+(h-1)*s[1]);
        }printf("%d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    Android Studio 编译报错 AAPT2 error: check logsfor details
    pytest01--生成测试报告及allure的介绍
    三号坑——自动化测试用例前置conftest.py文件
    【pycharm】如何设置以pytest方式去运行用例!!!
    二号坑 —— 导出、安装依赖包
    一号坑 —— 数据比对时碰到的问题
    十六——reflect反射机制
    十五—— 装饰器
    十三 —— 文件读写
    十二 —— python的内置函数
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7461428.html
Copyright © 2020-2023  润新知