Codeforces Round #241 (Div. 2)

来源:互联网 发布:.wang域名 编辑:程序博客网 时间:2024/06/04 18:51

A.Guess a number!

设置一个左值,一个右值,每次进行更新。

最后根据左右值判断结果。

若ri>le,则输出"Impossible",否则输出区间内任意一个数。

代码如下:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define INF 1000000007int min(int a,int b){    return a>b?b:a;}int max(int a,int b){    return a>b?a:b;}int main(){    int n,i,j,k,l,le,ri,a,len1,len2;    char s1[5],s2[5];    while(scanf("%d",&n)!=EOF)    {        for(i=1,le=-INF,ri=INF;i<=n;i++)        {            scanf("%s%d%s",s1,&a,s2);            len1=strlen(s1);            if(len1==1)            {                switch(s1[0])                {                case '<':if(s2[0]=='Y') ri=min(ri,a-1); else le=max(le,a);break;                    case '>':if(s2[0]=='Y') le=max(le,a+1);else ri=min(ri,a);break;                }            }            else            {                switch(s1[0])                {                case '<':if(s2[0]=='Y') ri=min(ri,a); else le=max(le,a+1);break;                    case '>':if(s2[0]=='Y') le=max(le,a);else ri=min(ri,a-1);break;                }            }        }        if(ri<le)        {            printf("Impossible\n");        }        else        {            printf("%d\n",le);        }    }    return 0;}

B.Art Union

模拟。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define INF 200000000int t[50005][7],ti[50005];int max(int a,int b){    return a>b?a:b;}int main(){    int m,n,i,j,k,l;    while(scanf("%d%d",&m,&n)!=EOF)    {        for(i=1;i<=m;i++)            for(j=1;j<=n;j++)            scanf("%d",&t[i][j]);        memset(ti,0,sizeof(ti));        for(i=1;i<=n;i++)        {            for(j=1;j<=m;j++)                ti[j]=max(ti[j],ti[j-1])+t[j][i];        }        for(i=1;i<=m;i++)            if(i==m)            printf("%d\n",ti[i]);        else            printf("%d ",ti[i]);    }    return 0;}

C.Booking System

有n组旅客,每组旅客有人数和花费。

有k张桌子,每张桌子最多能坐ri人。

每组旅客必须坐在同一张桌子上,且一张桌子上只能坐同一组的人。

贪心,旅客按花费排序从大到小,桌子按人数从小到大。

对旅客寻找满足条件的最小的桌子。

从而求出最后的结果。

看代码。qsort写比较函数好麻烦。。。以后还是去学习一下sort吧。。。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define INF 200000000struct group{    int id;    int c;    int p;}gg[1005];struct table{    int id;    int r;}tt[1005];int visit[1005],re[1005][2];int cmp1(const void *a,const void *b){    struct group *x=(struct group *)a;    struct group *y=(struct group *)b;    if((*x).p<(*y).p)        return 1;    else if((*x).p>(*y).p)        return -1;    else        return 0;}int cmp2(const void *a,const void *b){    struct table *x=(struct table *)a;    struct table *y=(struct table *)b;    if((*x).r<(*y).r)        return -1;    else if((*x).r>(*y).r)    return 1;    else        return 0;}int main(){    int n,kk,i,j,k,l,tot,sum;    while(scanf("%d",&n)!=EOF)    {        for(i=0;i<n;i++)        {            scanf("%d%d",&gg[i].c,&gg[i].p);            gg[i].id=i+1;        }        qsort(gg,n,sizeof(gg[0]),cmp1);        scanf("%d",&kk);        for(i=0;i<kk;i++)        {            scanf("%d",&tt[i].r);            tt[i].id=i+1;        }        qsort(tt,kk,sizeof(tt[0]),cmp2);        memset(visit,0,sizeof(visit));        for(i=0,sum=0,tot=0;i<n;i++)        {            for(j=0;j<kk;j++)            {                if(visit[j]==0&&tt[j].r>=gg[i].c)                {                    sum+=gg[i].p;                    tot++;                    re[tot][0]=gg[i].id;                    re[tot][1]=tt[j].id;                    visit[j]=1;                    break;                }            }        }        printf("%d %d\n",tot,sum);        for(i=1;i<=tot;i++)        {            printf("%d %d\n",re[i][0],re[i][1]);        }        /*for(i=0;i<n;i++)            printf("%d %d %d\n",gg[i].id,gg[i].c,gg[i].p);        for(i=0;i<kk;i++)            printf("%d %d\n",tt[i].id,tt[i].r);*/    }    return 0;}


0 0