重庆赛区ACM热身赛 8529. Cake

本文探讨了如何通过算法解决将蛋糕公平分配给两人的问题,重点在于寻找两人获得蛋糕角度之差的最小值,提供了两种不同的算法实现,一种是通过暴力枚举,另一种则是通过排序和动态调整分配策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8529. Cake

【问题描述】

小 W 和小 R 同月同日生,今天是他们的生日~

但是只有一个生日蛋糕,切成了 n 块(每块是角度为 ai 的扇形)。

现在他们两人要拿走连续的若干块蛋糕(最终没有蛋糕剩余)。他们想知道怎样分,才能使得两人得到的扇形角度的总和之差最小。

输出两人获得蛋糕总和的最小角度差。(可能出现其中一人分不到任何蛋糕的情况。)

【输入形式】

第一行一个整数 n(1≤n≤360),表示蛋糕切成的扇形块数

第二行 n 个整数 ai(1≤ai≤360),表示每块扇形的角度,保证角度之和为 360 。输入数据是一个环。

【输出形式】

输出一个非负整数,表示小 W 与小 R 获得蛋糕角度之差的最小值。

【样例输入】

3
100 160 100

【样例输出】

40

【样例说明】
在这里插入图片描述
红色与黄色部分分别表示小 W 与小 R 分得的蛋糕,小 W 拿第 1、3 块,小 R 拿第 2 块。

【出题人】

Ryan

我之前的算法有问题,题没读清楚,感谢@WuYaoBing大佬指出来,可能是OJ的BUG可以过OJ。
下面是改进后的AC代码,暴力枚举直接过:
(c++编译错误。。。改成c就好了,这OJ真的刷的一言难尽)

#include"stdio.h"
#include"math.h"

int n,minn=360;
int num[367];
int main()
{
	int i,j,sum;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&num[i]);
	for(i=0;i<n;i++)
	{
		sum=0;
		for(j=i;j<=n;j++)
		{
			sum+=num[j];
			if(abs(360-sum-sum)<minn)
				minn=abs(360-sum-sum);
		}
	}
	printf("%d\n",minn);
	return 0;
}

—————————————————————————分割线——————————————————————————

以下是之前写的!

题解:比较水的一道题,话是这样说但我看见大佬们用的dp。。。
emmm题目大概意思是有n块蛋糕,每块度数(大小)不同,分给两个人怎么分相差最少。很简单,先把每块蛋糕的大小用数组存起来,然后降序排序,两个变量a,b,分别代表w和r分的的总蛋糕,从前往后加就行了,a>b就给b,反之给a,最后输出a,b的差。下面是AC代码:

#include"iostream"
#include"algorithm"
#include"cmath"

using namespace std;

int main()
{
	int n;
	cin >> n;
	int *num=new int[n];
	for(int i=0;i<n;i++)
		cin >> num[i];
	sort(num,num+n);
	reverse(num,num+n);//默认升序,翻转一下变成降序
	int a=0,b=0;
	for(int i=0;i<n;i++)
	{
		if(a>b)
			b+=num[i];
		else
			a+=num[i];
	}
	cout << abs(a-b) << endl;
	return 0;
}

觉得有用就点个赞吧,右上角哦,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值