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;
}
觉得有用就点个赞吧,右上角哦,谢谢。