uva 10905 - Children's Game(排序中的贪心)

来源:互联网 发布:怎么恢复手机里的数据 编辑:程序博客网 时间:2024/04/30 00:06

题目链接:click here~

刚看完一些贪心的题目,看此题就特别想用贪心。。谁知走到死胡同里了(虽然此题的解法就是排序的贪心)。。我先根据字典序从大到小给数字排序,然后再各种分情况,比如945 94,应该选94 在前面因为前者最后一个是5比9小,类似这种,WA了3回然后上uvatoolkit测试数据,测试了1000组数据错了10组,仔细研究了下,顿时让我心碎了,这个思路根本不对头。。虽然能通过很多数据。。

此题思路是:想取得最大的数字,首先肯定前面的要大,全部的最大等同于与局部最大的排在前面,就是说答案里第一个数字和第二个数字的序列一定比任何一个2个数字的序列都要大,除了第一个数字,第二个数字与第三个数字的序列比任何一个2个数字的序列都要大,总结下来就是把qsort的cmp写成如果数字1加数字2大于数字2加数字1,那就把数字1排在数字2前面,这样下去就一定能得到我刚才说的。很有技巧的一道题目

AC代码:

#include<cstdio>#include<ctype.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<stack>#include<cmath>#include<queue>#include<set>#include<ctime>using namespace std;#define NMAX 500005#define ll long longstruct status{    char num[1000];    int len;} a[51];int cmp(const void *a, const void *b){    status *temp1 = (status*)a;    status *temp2 = (status*)b;    char t1[1000],t2[1000];    strcpy(t1,temp1->num);    strcpy(t2,temp2->num);    int k,w;    for(k = temp1->len,w=0; k < temp1->len+temp2->len; k++,w++)        t1[k] = temp2->num[w];    t1[k] = '\0';    for(k = temp2->len,w=0; k < temp1->len+temp2->len; k++,w++)        t2[k] = temp1->num[w];    t2[k] = '\0';    if(strcmp(t1,t2) > 0) return -1;    else   return 1;}int main(){//    freopen("input.txt","r",stdin);//    freopen("o1.txt","w",stdout);    int i,n;    while(~scanf("%d",&n) && n)    {        for(i = 0; i < n; i++)        {            scanf("%s",a[i].num);            a[i].len = strlen(a[i].num);        }//        for(i = 0; i < n; i++)//            printf("%s ",a[i].num);//        cout<<endl;        qsort(a,n,sizeof(a[i]),cmp);        for(i = 0; i < n; i++)            printf("%s",a[i].num);        printf("\n");    }    return 0;}


0 0
原创粉丝点击