Main » 2011 » November » 10 » 韩国明星(解题报告+原程)
11:10 AM
韩国明星(解题报告+原程)

【问题描述】

   在LazyCat同学的影响下,Roby同学开始听韩国的音乐,并且越来越喜欢H.o.T,尤其喜欢安七炫和Tony,可是,爱学习爱思考的Roby同学想,如果以后喜欢的韩星越来越多怎么办呢?Roby怎么知道Roby最喜欢谁呢(Roby都不知道谁知道呢。。。。)? 
   于是,Roby同学求助于你。 
   Roby首先会给你一张表,表上是所有他认识的韩星的名字,一开始他对所有韩星的好感度都为0。 
   然后Roby会告诉你一些他对某个韩星的好感度变化。 
   最后,请按照Roby对他们好感从大到小的顺序输出他们。 
 
[输入] 
   第一行一个个数N,表示Roby知道的韩星数目。 
   后面有N行,表示每一个Roby认识的韩星的名字。 
   再下面一行一个数K。 
   接下来2*K行,每两行为一组,上面一行为韩星的名字Name,下面一行为好感度变化量Change。 
 
[输出] 
   N*2行,依据韩星们的受Roby好感度从大到小的顺序输出,每两行为一组,第一行输出韩星的名字,第二行输出受Roby的好感度。
[样例输入] 
   3 
   HhIsaGay 
   ZcLoveStudy 
   OneBlueOne 
   5 
   ZcLoveStudy 
   100 
   OneBlueOne 
   8888 
   ZcLoveStudy 
   20 
   OneBlueOne 
   8888 
   HhIsaGay 
   -1000

[样例输出] 
   OneBlueOne 
   17776 
   ZcLoveStudy 
   120 
   HhIsaGay 
   -1000
[数据范围] 
   对于20%的数据,保证N<=100,K<=100. 
   对于40%的数据,保证N<=10000,K<=30000. 
   对于100%的数据,保证N<=100000 -8888<=Change<=8888 K<=100000.
[时限] 
   2S

题解:
本题属于字符串处理题,如果用单纯的模拟是绝对超时的,因为有100000组数据,呵呵,转念一想,也就是查找给的那个人是费时间,所以我采取了二分查找的方法,速度一流,呵呵,上代码!!
原程:C++语言: Codee#23888
#include
#include
#include
#include
using namespace std;
int n,m;
int find();
char str[100];
int cmp1(const void*a,const void *b);
int cmp2(const void *a,const void *b);
struct hehe
{
    int mark;
    char s[100];
}q[100001];
int main()
{
    freopen ("star.in","r",stdin);
    freopen ("star.out","w",stdout);
    scanf("%d\n",&n);
    for (int i=0;i<n;i++)
    {
        scanf("%[^'\n]\n",&q[i].s);
        q[i].mark=0;
    }
    qsort(q,n,sizeof(q[0]),cmp1);
    scanf("%d\n",&m);
    for (int i=0;i<m;i++)
    {
        scanf("%[^\n]\n",&str);
        int temp;
        temp=find();
        int tmp;
        scanf("%d\n",&tmp);
        q[temp].mark+=tmp;
    }
    qsort(q,n,sizeof(q[0]),cmp2);
    for (int i=0;i<n;i++)
    {
        cout<<q[i].s<<endl<<q[i].mark<<endl;
    }
    return 0;
}
int cmp1(const void*a,const void *b)
{
    struct hehe*c=(struct hehe*)a;
    struct hehe*d=(struct hehe*)b;
    return strcmp(c->s,d->s);
}
int find()
{
    int l=0;
    int r,mid;
    r=n -1;
    mid=((l+r)>>1);
    while (l<r)
    {
        if (l==r)
            return l;
        else
        {
            if (strcmp(q[mid].s,str)<0)
            {
                l=mid+1;
                mid=((l+r)>>1);
                continue;
            }
            if (strcmp(q[mid].s,str)==0)
            {
                return mid;
            }
            if (strcmp(q[mid].s,str)>0)
            {
                r=mid-1;
                mid=((l+r)>>1);
                continue;
            }
        }
    }
    return l;
}
int cmp2(const void *a,const void *b)
{
    struct hehe *c=(struct hehe*)a;
    struct hehe *d=(struct hehe*)b;
    return d->mark - c->mark;
}
Views: 550 | Added by: dandan | Tags: Test | Rating: 0.0/0
Total comments: 0
Name *:
Email *:
Code *: