题目描述
淘淘和蓝蓝在星际旅行时来到了瓦尔登星,他们们遇到了这里的原住精灵,决定将飞船里的桃子分给他们一些。精灵一共有 N 只,编号为 1 到 N,第 i 只精灵需要吃 Ai 个桃子。现在每只精灵会按 1到 N 的顺序领取桃子,每只精灵可选择淘淘和蓝蓝中的一个人,并向他讨要桃子。但精灵们也会有情绪,假设前面和自己选了同一个人的精灵讨要到的桃子的最大个数是 x,如果 x 大于自己的需求 Ai,那么这个精灵会产生 x-Ai 的不开心值;如果 x 不大于自己的需求 Ai,那么这个精灵不会产生不开心值。淘淘和蓝蓝想让所有精灵的不开心值总和最小,他们想问你这个总和的最小值是多少?
输入
第一行一个整数 N,表示精灵个数。
第二行 N 个整数,第 i 个整数 Ai,表示第 i 只精灵需要吃的桃子数。
输出
一行一个整数表示最小的不开心值总和。
样例输入
5 5 3 4 6 2
样例输出
2
数据范围限制
对于 30%的数据 满足 N<=5
对于另外 10%的数据,满足所有的 Ai 均相等
对于另外 10%的数据,满足 Ai=i
对于 100%的数据,满足 N<=20,1<=Ai<=100000
#include<cstdio>
using namespace std;
int n,m,jk,k,l,p,a[10001];
int ans=999999;
void dg(int tao,int lan,int x,int y)
{
if(x<ans&&y>n)
{
ans=x;
return;
}
if(x>=ans||y>n)
return;
if(tao>a[y])
dg(tao,lan,x+tao-a[y],y+1);
else
dg(a[y],lan,x,y+1);
if(lan>a[y])
dg(tao,lan,x+lan-a[y],y+1);
else
dg(tao,a[y],x,y+1);
}
int main()
{
// freopen("e.in","r",stdin);
// freopen("e.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dg(0,0,0,1);
printf("%d",ans);
return 0;
}
提示
一种总和最小的可能为:
第 1,4 只精灵选择淘淘,由于 5<6,它们都不会产生不开心值
第 2,3,5 只精灵选择蓝蓝,由于 4>2,第五只精灵会产生 4-2=2 的不开心值
总和为 2
枚举就行