【HDU 3270】Cow Sorting

这道题也是一道置换群的题,是黑书上的一道很经典的题

对于一个长度为k的轮换来说,可以证明最少需要交换k-1次才能使它回到本来的状态

如(1 2 3 4 5)需要至少交换四次,而可以每次用最小的数来交换

就可以得到最小的代价。但是还有一种情况就是

用轮换外的数放进来,然后交换k次之后再将此数放出去

就可以得到

ans=ans+min(sum+(k-1-1)*m,sum+k*Min+(m+Min))

#include
#include
#include
using namespace std;
const int SIZEN=100005;
const int INF=1000005;
struct elem{
    int val;
    int id;
    bool operator <(const elem &a)const{
        return val

你可能感兴趣的:(置换群)