牛客假日团队赛2 H.奶牛排序
链接:
https://ac.nowcoder.com/acm/contest/924/H
题意:
农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动。因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序。每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同。在排序过程中,JOHN可以交换任意两头牛的位置。因为脾气大的牛不好移动,JOHN需要X+Y秒来交换脾气值为X和Y的两头牛。
请帮JOHN计算把所有牛排好序的最短时间。
思路:
离散化,置换群。
考虑位置移动会形成一个有向环,将这个环中最小的值挨个与每个值交替,这个环就变成我们需要的顺序了。
也可以将环中的最小值与环外的最小值交换,用环外的最小值代替交换,每个环选择代价最小的交换方式即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 3e5 + 10;
const int MOD = 1e9 + 7;
struct Node
{
    int v;
    int pos;
    bool operator < (const Node& that) const
    {
        return this->v < that.v;
    }
}node[MAXN];
int n, m, k, t;
int Pt[MAXN], Po[MAXN];
int A[MAXN], C[MAXN];
int Vis[MAXN];
int main()
{
//    freopen("test.in", "r", stdin);
    cin >> n;
    int mmin = 5e5+10;
    for (int i = 1;i <= n;i++)
    {
        cin >> node[i].v;
        node[i].pos = i;
        A[i] = node[i].v;
        mmin = min(mmin, A[i]);
    }
    sort(node+1, node+1+n);
    int cnt = 1;
    C[node[1].pos] = cnt;
    for (int i = 2;i <= n;i++)
    {
        if (node[i].v == node[i-1].v)
            C[node[i].pos] = cnt;
        else
            C[node[i].pos] = ++cnt;
    }
    LL res = 0;
    for (int i = 1;i <= n;i++)
    {
        if (Vis[i])
            continue;
        Vis[i] = 1;
        if (C[i] == i)
            continue;
        LL sum = 0;
        sum += A[i];
        int pos = C[i], tmpmin = A[i];
        int num = 1;
        while (pos != i)
        {
            Vis[pos] = 1;
            sum += A[pos];
            num++;
            tmpmin = min(A[pos], tmpmin);
            pos = C[pos];
        }
        LL v1 = 1LL*tmpmin*(num-1)+sum-tmpmin;
        LL v2 = 1LL*mmin*(num-1)+sum-tmpmin+2LL*(tmpmin+mmin);
        res += min(v1, v2);
    }
    cout << res << endl;
    return 0;
}
牛客假日团队赛2 H.奶牛排序的更多相关文章
- P5200 [USACO19JAN]Sleepy Cow Sorting 牛客假日团队赛6 D	迷路的牛 (贪心)
		链接:https://ac.nowcoder.com/acm/contest/993/E 来源:牛客网 对牛排序 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ... 
- 牛客假日团队赛6 D	迷路的牛  (思维)
		链接:https://ac.nowcoder.com/acm/contest/993/D 来源:牛客网 迷路的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ... 
- 牛客假日团队赛5 K	金币馅饼 (DP 基础题)
		链接:https://ac.nowcoder.com/acm/contest/984/K 来源:牛客网 金币馅饼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ... 
- 牛客假日团队赛5 F	随机数  BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)
		链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ... 
- 「BZOJ1669」D	饥饿的牛 [Usaco2006 Oct] Hungry Cows 牛客假日团队赛5   (LIS,离散化树状数组)
		链接:https://ac.nowcoder.com/acm/contest/984/D 来源:牛客网 饥饿的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ... 
- 牛客假日团队赛10  L	乘积最大 (dp,大数)
		链接:https://ac.nowcoder.com/acm/contest/1072/L?&headNav=acm&headNav=acm 来源:牛客网 乘积最大 时间限制:C/C+ ... 
- 牛客假日团队赛5J	护城河  bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 (凸包的周长)
		链接:https://ac.nowcoder.com/acm/contest/984/J 来源:牛客网 护城河 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ... 
- 牛客假日团队赛5 L	Catch That Cow  HDU 2717 (BFS)
		链接:https://ac.nowcoder.com/acm/contest/984/L 来源:牛客网 Catch That Cow 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 3 ... 
- 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day 牛客假日团队赛5 A (单调栈)
		链接:https://ac.nowcoder.com/acm/contest/984/A 来源:牛客网 题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,00 ... 
随机推荐
- ZOJ 3640 Help Me Escape:期望dp
			题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3640 题意: 有一个吸血鬼被困住了,他要逃跑... 他面前有n条 ... 
- c ++ auto 的使用
			该文转自:https://www.cnblogs.com/KunLunSu/p/7861330.html C++98 auto 早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为 ... 
- Codeforces Round #394 (Div. 2) 颓废记
			昨天晚上(今天凌晨),又忍不住去打CF.(本蒟弱到只能打Div.2)... 我觉得我可以用一个词概括我这次的CF: 呵呵 刚一开赛,我就codeforces访问失败.. 后来好不容易能上了,两三分钟才 ... 
- 【QT】《转载》常用快捷键
			F1 查看帮助F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果)Shift+F2 声明和定义之间切换F4 头文件和源文件之间切换Ctrl+1 ... 
- node.js Web应用框架Express入门指南
			node.js Web应用框架Express入门指南 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-28 我要评论 这篇文章主要介绍了node.js Web应用框架Express入门 ... 
- bzoj 3232 圈地游戏——0/1分数规划(或网络流)
			题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ... 
- printf函数指向串口的方法
			简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式),标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调 ... 
- C#父窗体右击事件实现
			之前在博问上提问过,没人回答啊,豆太少没人权? 没注册钩子的话根本没办法弹出右键菜单啊,因为在父窗体内有一个容器,所以鼠标在右击时是无法触发窗体的mousedown事件的,即使把KeyPreview设 ... 
- c# link 学习网站
			http://www.cnblogs.com/shanyou/p/4353433.html 
- JAVA类型信息——Class对象(转载)
			JAVA类型信息--Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ... 
