愚人

类似贪心。

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;
}

 

posted @ 2013-04-01 21:58  zhang1107  阅读(160)  评论(0编辑  收藏  举报