类似贪心。
http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2410
View Code
const int MM = 22222; int N,M; int cnt; int num[MM]; struct Info { int val; int id; void reset() { val=maxint; id=-1; } bool friend operator<(Info x,Info y) { if(x.val!=y.val) return x.val<y.val; else return x.id<y.id; } }p[MM]; char str[MM]; int dp[111][111]; vector<int>vec[2]; void get_data() { int i,j,k,mx=-1,a; scanf("%d",&N); for(i=0;i<MM;i++) p[i].reset(); for(i=0;i<N;i++) { scanf("%d",&p[i].val); p[i].id=i; } // printf("%d\n", cnt); // sort(p,p+N); /* vec[0].clear(); vec[1].clear(); for(i=0;i<N;i++) { // scanf("%d",&a); a=rand()%MM+1; vec[0].push_back(a); } for(i=0;i<N;i++) printf("%d ",vec[0][i]); printf("\n"); sort(vec[0].begin(),vec[0].end()); do { int sum=0; for(i=0;i<N;i++) { // printf("%d ",num[i]); if(i>0) sum+=f_max(vec[0][i],vec[0][i-1]); } if(mx==-1||mx>sum) {mx=sum; vec[1]=vec[0];} }while(next_permutation(vec[0].begin(),vec[0].end())); for(i=0;i<N;i++) printf("%d ",vec[1][i]); printf("\n"); */ } void solve() { int i,j,k,tmp,cc=1; bool flag=true; printcase(); bool vis[MM]; memset(vis,false,sizeof(vis)); printf("%d",p[0].id); tmp=p[0].val; vis[0]=true; while(1) { if(cc>=N) break; flag=false; for(i=0;i<N;i++) { if(vis[i]) continue; if(p[i].val<=tmp) {cc++;flag=true;vis[i]=true;tmp=p[i].val;printf(" %d",p[i].id); break;} } if(cc>=N) break; if(!flag) break; } Info ans[111]; int cnt=0; if(!flag && cc<N) { for(i=0;i<N;i++) { if(!vis[i]) ans[cnt++]=p[i]; } } sort(ans,ans+cnt); for(i=0;i<cnt;i++) printf(" %d",ans[i].id); printf("\n"); } //5 1 2 5 3 4 int main() { // freopen("input.txt","r",stdin); // freopen("ouput.txt","w",stdout); int ca; while(scanf("%d",&ca)!=EOF) { g=1; while(ca--) get_data(),solve(); } /* gets(str); for(int i=1;i<26;i++) { for(int j=0;str[j]!='\0';j++) { // if(str[j]==' ') printf(" "); printf("%c",str[j]+i); } printf("\n"); } */ return 0; }