Codeforces Round #173 (Div. 2)总结

17 篇文章 0 订阅

a题:

算是一个模拟题吧,就模拟++操作。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
	int ans=0;
	char op[10];
	for(int i=0;i<n;i++)
	{
	    scanf("%s",op);
	    if(op[0]=='+')
		ans++;
	    else if(op[0]=='-')
		ans--;
	    if(op[2]=='+')
		ans++;
	    else if(op[2]=='-')
		ans--;
	}
	printf("%d\n",ans);
    }
    return 0;
}

b题:

题意还是比较好理解,由于题目答案可以任意,随意输出一个就可以了。

其实方法就是尽量的保证2边和的差值最小,然后进行取。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#define MAX 1000001
using namespace std;
char ans[MAX];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
	int suma=0,sumb=0,cou=0;
	for(int i=0;i<n;i++)
	{
	    int ita,itb;
	    scanf("%d%d",&ita,&itb);
	    if(abs(suma+ita-sumb)<=abs(sumb+itb-suma))
		suma+=ita,ans[cou++]='A';
	    else
		sumb+=itb,ans[cou++]='G';
	}
	ans[cou]='\0';
	if(abs(suma-sumb)>500)
	    printf("-1\n");
	else
	    printf("%s\n",ans);
	
    }
    return 0;
}

C:

题目描述比较复杂,其实想明白了就很简单,如果2个都有1的话那么是肯定可以变化的,如果2个全为0也行,只有当一个没有1,而一个有1的时候不可以。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 1000001
using namespace std;
char stra[MAX],strb[MAX];
int main()
{
    while(scanf("%s%s",stra,strb)!=EOF)
    {
	if(strlen(stra)!=strlen(strb))
	{
	    printf("NO\n");
	    continue;
	}
	int flaga=0,flagb=0;
	for(int i=0;i<strlen(stra);i++)
	{
	    if(stra[i]=='1')
		flaga=1;
	    if(strb[i]=='1')
		flagb=1;
	    if(flaga&&flagb)
		break;
	}
	if(flaga==flagb) 
	    printf("YES\n");
	else
	    printf("NO\n");
    }
    return 0;
}

D题:一堆石子就不用说了吧,两堆就是经典的威佐夫博奕(Wythoff Game),应为数据量小直接写的递归,三堆石子我觉得是威佐夫博奕(Wythoff Game)和尼姆博奕(Nimm Game)合体加强版不过不是单纯的合体....

对于当n=3的情况,因为属于nim游戏,所以有结论当a1^a2^a3=0为必败点

代码:

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
int d[301][301];
int dd[302][302][302];

int f2(int a,int b)
{
    if(a>b){int t=a;a=b,b=t;}
    if(d[a][b]!=-1)
        return d[a][b];
    for(int i=a-1;i>=0;i--)
        if(!f2(i,b))
        {
            d[a][b]=1;
            return 1;
        }
    for(int i=b-1;i>=0;i--)
        if(!f2(a,i))
        {
            d[a][b]=1;
            return 1;
        }
    for(int i=a;i>=1;i--)
        if(!f2(a-i,b-i))
        {
            d[a][b]=1;
            return 1;
        }
        d[a][b]=0;
    return 0;
}

int main()
{
    int m;
    int a,b,c;
    scanf("%d",&m);
    if(m==1)
    {
        scanf("%d",&a);
        if(a)
        printf("BitLGM");
        else
        printf("BitAryo");
    }
    else
        if(m==2)
        {
            scanf("%d%d",&a,&b);
            memset(d,-1,sizeof(d));
            d[0][0]=0;
            if(f2(a,b))
                printf("BitLGM");
            else
                printf("BitAryo");
        }
        else
        {
            memset(dd,0,sizeof(dd));
            scanf("%d%d%d",&a,&b,&c);
            if(a^b^c)
                printf("BitLGM");
            else
                printf("BitAryo");

        }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值