Codeforces Round #387 (Div. 2)

来源:互联网 发布:vb.net socket 多线程 编辑:程序博客网 时间:2024/05/18 17:01

这段时间因为工作轻松一些,所以重新开始打codeforces了。

不过成绩挺让人心寒的。

A.水题,签到

#include<stdio.h>#include<string.h>int ab(int x,int y){    if(x-y>0) return x;    else return y;}int main(){    int n,a,b;    scanf("%d",&n);    a=1;    b=n;    for(int i=1;i<=n/2;i++)    {        if(n%i==0)        {            int t1,t2;            t1=i;            t2=n/i;            if(ab(t1,t2)<ab(a,b))            {                a=t1<t2?t1:t2;                b=t1<t2?t2:t1;            }        }    }    printf("%d %d\n",a,b);    return 0;}

B.水题,签到

#include<stdio.h>#include<string.h>#define N 300int main(){    int n;    char s[N];    while(scanf("%d",&n)!=EOF)    {        scanf("%s",s);        if(n%4!=0)        {            printf("===\n");            continue;        }        int target=n/4;        int t1,t2,t3,t4;        t1=t2=t3=t4=0;        for(int i=0;s[i]!='\0';i++)        {            if(s[i]=='A') t1++;            else if(s[i]=='C') t2++;            else if(s[i]=='G') t3++;            else if(s[i]=='T') t4++;        }        t1=target-t1;        t2=target-t2;        t3=target-t3;        t4=target-t4;        if(t1<0||t2<0||t3<0||t4<0)        {            printf("===\n");            continue;        }        int cnt1,cnt2,cnt3,cnt4;        cnt1=cnt2=cnt3=cnt4=0;        for(int i=0;i<n;i++)        {            if(s[i]=='A')            {                ;            }else if(s[i]=='C')            {                ;            }else if(s[i]=='G')            {                ;            }else if(s[i]=='T')            {                ;            }else            {                if(cnt1<t1)                {                    s[i]='A';                    cnt1++;                }else if(cnt2<t2)                {                    s[i]='C';                    cnt2++;                }else if(cnt3<t3)                {                    s[i]='G';                    cnt3++;                }else if(cnt4<t4)                {                    s[i]='T';                    cnt4++;                }            }            printf("%c",s[i]);        }        printf("\n");    }    return 0;}

C.记录服务器使用的截止时间。时限比较宽。

#include<stdio.h>#include<string.h>#define N 105int server[N];int n,q;int check(int t,int k,int d){int count=0;for(int i=1;i<=n;i++){if(server[i]<=t){count++;}}if(count<k)return -1;int ans=0;count=0;for(int i=1;i<=n;i++){if(server[i]<=t){ans+=i;server[i]=t+d;count++;}if(count==k){return ans;}}return ans;}int main(){while(scanf("%d%d",&n,&q)!=EOF){memset(server,0,sizeof(server));for(int i=1;i<=q;i++){int t,k,d;scanf("%d%d%d",&t,&k,&d);int ans=check(t,k,d);printf("%d\n",ans);}}return 0;}

D.排序,优先填中间的坑,对两头做特殊处理。

#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 200005int day[N],minus[N];int cmp(const void *a,const void *b){return *(int *)a-*(int *)b;}int main(){int n,q;while(scanf("%d%d",&n,&q)!=EOF){int count=0;for(int i=1;i<=n;i++){scanf("%d",&day[i]);if(day[i]<0) count++;}if(count>q){printf("-1\n");continue;}else if(count==0){printf("0\n");continue;}int left=q-count;int k=0;int current=0;day[n+1]=-1;for(int i=1;i<=n+1;i++){if(day[i]<0)            {minus[k++]=i-current-1;                current=i;            }}qsort(minus+1,k-2,sizeof(minus[0]),cmp);int ans=0;for(int i=1;i<k-1;i++){if(minus[i]==0) continue;if(left>=minus[i]){left-=minus[i];continue;}ans+=2;}ans+=2;if(minus[k-1]<=left) ans--;printf("%d\n",ans);}return 0;}

E.分割字符串,建树。dfs获取树的深度,bfs按层输出。

怎么申请内存让我搞了好久。

输出那部分写的特别丑。

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#define N 1000005char s_in[N],temp[N];char **s;int edge[N],next[N],head[N],vis[N],stack[N];int cnt;struct node{    int id;    int no;};void addEdge(int x,int y){    edge[cnt]=y;next[cnt]=head[x];head[x]=cnt++;    return ;}int my_spilt(){    struct node q[N];    int k=1;    int index=0;    int h,t;    s=(char **)malloc(sizeof(char *)*N);    h=t=0;    q[t].id=0;    q[t++].no=N;    int flag=0;    for(int i=0;s_in[i]!='\0';i++)    {        if(s_in[i]!=',')        {            temp[index++]=s_in[i];        }else        {            temp[index]='\0';            if(!flag)            {                s[k]=(char *)malloc(sizeof(char *)*(index+1));                strcpy(s[k],temp);                q[t].id=k;                while(q[t-1].no==0)                    t--;                q[t-1].no--;                addEdge(q[t-1].id,k++);            }else            {                int no=atoi(temp);                q[t++].no=no;            }            flag=(flag+1)%2;            index=0;        }    }    return 0;}int dfs(int father,int deep){    int ans=deep-1;    for(int i=head[father];i!=-1;i=next[i])    {        int son=edge[i];        if(vis[son])            continue;        vis[son]=1;        int temp=dfs(son,deep+1);        ans=temp>ans?temp:ans;    }    return ans;}int bfs(){    struct node q[N];    int h,t;    h=t=0;    q[t].id=0;    q[t++].no=0;    int count=0;    stack[count++]=-1;    int current=0;    while(h!=t)    {        struct node cur=q[h++];        if(cur.no==current+1)        {            stack[count++]=-1;            current++;        }        for(int i=head[cur.id];i!=-1;i=next[i])        {            int son=edge[i];            if(vis[son])                continue;            vis[son]=1;            q[t].id=son;            q[t++].no=cur.no+1;            stack[count++]=son;        }    }    return count;}int main(){    while(scanf("%s",s_in)!=EOF)    {        memset(head,-1,sizeof(head));        memset(next,-1,sizeof(next));        cnt=0;        my_spilt();        memset(vis,0,sizeof(vis));        printf("%d\n",dfs(0,1));        memset(vis,0,sizeof(vis));        int count=bfs();        for(int i=1;i<count;i++)        {            if(stack[i]==-1)            {                for(int j=i-1;j>=0&&stack[j]!=-1;j--)                {                    printf("%s ",s[stack[j]]);                }                printf("\n");            }        }    }    return 0;}


0 0
原创粉丝点击