Codeforces Round #151 (Div. 2)笔记

今天应该算第一次开始做CF,把当时没搞出来的题目总结一下吧

C. Beauty Pageant

题意:

  给N个互不相同的数字,要组成M(M<=N*(N+1)/2)种不同的SUM,要求输出每种组成的方法.

错误思路:

  比赛的时候没有注意M的数据范围...结果居然写了个深搜...OMG,这明显要超时的节奏啊,没想到交上去以后样例居然过了,看来比赛中的样例M是不够大啊...不过中途还是被某个牛人hack掉了- -。

正确思路:

  注意到M的范围很重要,因为一共有N个数字,假设现在要一个L个人的组合,那么可以固定L-1个人(直接取最后L-1个人就好了,很方便),剩下的N-L+1个人依次可以和这L-1个人组合,得到一个人数为L的SUM,这样可以保证人数为L的组合的SUM是没有重复的,现在我们再加入一个排序,让数组是从小到大排列的,这样一来,由于每次都取数组最后的几个数,而L+1个人的组合比L个人的组合多一个人,也就是L+1组成的SUM一定大于L个人组成的SUM,这样确保了唯一性,且正好能得到N*(N-1)/2种情况.

代码:

View Code
#include<stdio.h>
#include<stdlib.h>

int va[60];

int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}

int main()
{
    int n,k,i,j,ll;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&va[i]);
        }
        qsort(va+1,n,sizeof(va[0]),cmp);
        for(i=0;i<n;i++)
        {
            if(k==0)break;
            for(j=1;j+i<=n;j++)
            {
                if(k==0)break;
                printf("%d",i+1);
                for(ll=n;ll>n-i;ll--)
                {
                    printf(" %d",va[ll]);
                }
                printf(" %d\n",va[j]);
                k--;
            }
        }
    }
    return 0;
}

 

D. Colorful Graph

题意:

  给你N个点和M条边,每个点有一个颜色,每个颜色的价值=与这个颜色的点相邻的不同颜色的个数.

错误思路:

  这个思路已经不用说了吧...大家都知道的...把每个颜色相邻的颜色都记录下来,然后排序判重...当时读题的时候C题被黑掉了,直接导致D题看得太快理解错了题意,最后就没时间搞了.这题着实是亏大了ToT.

正确思路:

  同上,详见代码,不过要特别注意每个颜色的相邻颜色都是本身的情况需要特判.

View Code
#include<stdio.h>
#include<stdlib.h>

struct node
{
    int x,y;
}seg[210000];

int va[110000];
int cmp(const void *a,const void *b)
{
    if((*(node *)a).x==(*(node *)b).x)
        return (*(node *)a).y-(*(node *)b).y;
    else
        return (*(node *)a).x-(*(node *)b).x;
}

int cmp2(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}

int main()
{
    int n,m,temp1,temp2;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&va[i]);
        }
        int cnt=0;
        while(m--)
        {
            scanf("%d%d",&temp1,&temp2);
            if(va[temp1]!=va[temp2])
            {
                seg[cnt].x=va[temp1];
                seg[cnt++].y=va[temp2];
                seg[cnt].x=va[temp2];
                seg[cnt++].y=va[temp1];
            }
        }
        qsort(seg,cnt,sizeof(seg[0]),cmp);
        int max=0,ans=0,count=0;
        for(int i=0;i<cnt;i++)
        {
            if(seg[i].x==seg[i+1].x&&seg[i].y!=seg[i+1].y)
                count++;
            else if(seg[i].x!=seg[i+1].x)
            {
                count++;
                if(count>max)
                {
                    max=count;
                    ans=seg[i].x;
                }
                count=0;
            }
        }
        if(max==0)
        {
            qsort(va+1,n,sizeof(va[0]),cmp2);
            printf("%d\n",va[1]);
        }
        else
            printf("%d\n",ans);
    }
    return 0;
}
posted @ 2012-11-22 10:50  破晓べ  阅读(198)  评论(0编辑  收藏  举报