贪心模拟,需要注意一下,要按照当前最小的元素往两边走,而不是枚举最大的元素的移动后的位置,因为即使最大元素移动到了当前位置,也不能人为拆为两个部分。
#include <cstdio> #include <iostream> using namespace std; int T,N,A[1001],vis[1001],ID[1001]; int main(){ freopen("B-large-practice.in","r",stdin); freopen("b.out","w",stdout); cin>>T; for(int cas=1; cas<=T; ++cas){ cin>>N; for(int i=0; i<N; ++i){ cin>>A[i]; ID[i]=i; vis[i]=0; } int cnt=0,l=0,r=N-1,ans=0; while(1){ if(cnt==N) break; int _min=0x7fffffff,id=-1; for(int i=0; i<N; ++i){ if(vis[i]) continue; if(_min>A[i]){ _min=A[i]; id=i; } } vis[id]=1; ++cnt; if(ID[id]-l<r-ID[id]){ ans+=ID[id]-l; ++l; //cout<<ans<<endl; for(int i=0; i<id; ++i){ ++ID[i]; } }else{ ans+=r-ID[id]; --r; //cout<<ans<<endl; for(int i=N-1; i>id; --i){ --ID[i]; } } } printf("Case #%d: %d\n",cas,ans); } }