Codeforces Round #268 (Div. 2) C 24 Game

也是好久没有写博客,代码最近也少敲了。一直在学数学来着,前些天一场cf打下来又重新变为蓝名,写一下帮助我加了200多分的C题。

24game,看题目感觉就是24点这玩意,不过题目要求从1到n 用到所有的数字,包括中间结果,最后得出一个24.

因为1*2*3*4=24,所以4以下的必定是凑不够了。5是1+2*4+3*5=24,6可以是2-1+3*4+5+6=24,7是1-2+3+4+5+6+7=24;

肯定不能这样一直推到下去,题目中虽然给出了8的情况,但是毕竟是特判,当时猛然想到了8的情况可以变为:在4已经凑够24的基础上,5-6+8-7=0;同理可以得到9、10、11;然后每4个数字可以凑成一个0。那么4个一循环重复输出这样的式子就可以了。

#include<stdio.h>
#include<string.h>
void si(int n)
{
	int flag=0,fuck=0;
	puts("YES");
	int w=n-4;
	if(w==0) flag=0;
	else//这个部分主要是进行有多少次重复输出,因为中间结果要用上,所以判断是否会有0+1=1这个式子;
	{
		flag=1;
		while(w>0)
		{
			if(fuck!=0)
				printf("0 + %d = %d\n",n-fuck,n-fuck);
			printf("%d - %d = -1\n",n-1-fuck,n-fuck);
			printf("%d - %d = 1\n",n-2-fuck,n-3-fuck);
			puts("-1 + 1 = 0");
			w=w-4;
			fuck+=4;
		}
	}
	if(flag)
		puts("0 + 1 = 1");
	puts("1 * 2 = 2");
	puts("2 * 3 = 6");
	puts("6 * 4 = 24");
}
void wu(int n)
{
	int flag=0,fuck=0;
	puts("YES");
	int w=n-4;
	if(w==1) flag=0;
	else
	{
		flag=1;
		while(w>1)
		{
			if(fuck!=0)
				printf("0 + %d = %d\n",n-fuck,n-fuck);
			printf("%d - %d = -1\n",n-1-fuck,n-fuck);
			printf("%d - %d = 1\n",n-2-fuck,n-3-fuck);
			puts("-1 + 1 = 0");
			w=w-4;
			fuck+=4;
		}
	}
	if(flag)
		puts("0 + 1 = 1");
	puts("2 * 4 = 8");
	puts("1 + 8 = 9");
	puts("3 * 5 = 15");
	puts("9 + 15 = 24");
}
void liu(int n)
{
	int flag=0,fuck=0;
	puts("YES");
	int w=n-4;
	if(w==2) flag=0;
	else
	{
		flag=1;
		while(w>2)
		{
			if(fuck!=0)
				printf("0 + %d = %d\n",n-fuck,n-fuck);
			printf("%d - %d = -1\n",n-1-fuck,n-fuck);
			printf("%d - %d = 1\n",n-2-fuck,n-3-fuck);
			puts("-1 + 1 = 0");
			w=w-4;
			fuck+=4;
		}
	}
	if(flag)
		puts("0 + 1 = 1");
	puts("3 * 4 = 12");
	puts("2 - 1 = 1");
	puts("1 + 12 = 13");
	puts("5 + 13 = 18");
	puts("18 + 6 = 24");
}
void qi(int n)
{
	int flag=0,fuck=0;
	puts("YES");
	int w=n-4;
	if(w==3) flag=0;
	else
	{
		flag=1;
		while(w>3)
		{
			if(fuck!=0)
				printf("0 + %d = %d\n",n-fuck,n-fuck);
			printf("%d - %d = -1\n",n-1-fuck,n-fuck);
			printf("%d - %d = 1\n",n-2-fuck,n-3-fuck);
			puts("-1 + 1 = 0");
			w=w-4;
			fuck+=4;
		}
	}
	if(flag)
		puts("0 + 1 = 1");
	puts("1 - 2 = -1");
	puts("-1 + 3 = 2");
	puts("2 + 4 = 6");
	puts("6 + 5 = 11");
	puts("11 + 6 = 17");
	puts("17 + 7 = 24");
}
int main()
{
	int n;
	scanf("%d",&n);
	if(n<4)
		puts("NO");
	else if(n%4==0)
		si(n);
	else if(n%4==1)
		wu(n);
	else if(n%4==2)
		liu(n);
	else if(n%4==3)
		qi(n);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值