农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动。因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序。每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同。在排序过程中,JOHN 可以交换任意两头牛的位置。因为脾气大的牛不好移动,JOHN需要X+Y秒来交换脾气值为X和Y的两头牛。 请帮JOHN计算把所有牛排好序的最短时间。
标签:for names namespace 整数 char soft cstring 最小 include
农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动。因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序。每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同。在排序过程中,JOHN 可以交换任意两头牛的位置。因为脾气大的牛不好移动,JOHN需要X+Y秒来交换脾气值为X和Y的两头牛。 请帮JOHN计算把所有牛排好序的最短时间。
第1行: 一个数, N。
第2~N+1行: 每行一个数,第i+1行是第i头牛的脾气值。
第1行: 一个数,把所有牛排好序的最短时间。
#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\n",ans); return 0; }
bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序
标签:for names namespace 整数 char soft cstring 最小 include
原文地址:http://www.cnblogs.com/lyzuikeai/p/7461428.html