描述:贪心算法:选择当前状况下(局部状况)的最优解,从而的出全局状况的最优解。(得出来的全局解是否为最优需证明)需证明啊!!!证明!!!
例:
图标排列
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:71 测试通过:19
描述
百度应用平台上有很多有趣的应用,每个应用都由一个开发者开发,每个开发者可能开发一个或多个应用。百度的工程师们想把应用尽可能好的推荐给用户。
研究发现,同一个开发者开发的程序的图标有很大的相似性。如果把同一个开发者开发的应用放在一起,用户很快就会厌倦相似的图标,如果把这些图标穿插摆放效果就会好很多。
现在工程师想给用户推荐来自m个开发者的n个应用,在推荐的时候这些应用的图标将排成整齐的一行展示给用户,相邻两个图标之间的距离正好是1,工程师们想让这些图标尽可能的穿插摆放。为了衡量穿插摆放的效果,给每个图标定义一个“分离度”,分离度的值是指当前图标和它左边最近的来自同一个开发者的图标之间的距离。如果一个图标左边没有来自同一个开发者的图标,则分离度为0。所有图标穿插摆放效果的值定义为所有图标的分离度之和。
已知每个开发者开发的应用个数,请帮助百度的工程师找到图标穿插摆放效果的最大值。
输入
输入的第一行包含两个整数n和m,用一个空格分隔,分别表示应用的个数和开发者的个数。
第二行包含m个正整数,相邻两个数之间用一个空格分隔,表示每个开发者开发的应用个数,这些整数之和必然等于n。
输出
输出一个整数,表示图标穿插摆放效果的最大值。
样例输入
8 3
3 3 2
样例输出
15
分析:
按照题目意思模拟几遍就可以发现,同一程序猴子设计的程序的分离度等于排在第一个的程序和排在最后一个的程序之间的距离,而所有图标穿插摆放效果的值定义为所有图标的分离度之和。那么,要是所有图标的分离度之和尽量最大,就需要一种程序图标的分离度尽量大,也就是说,只要同一个程序猴子设计的程序大于或等于两个,就把其中两个放在两段,对于每一种程序都这么做就可以得到最大值。然后就可以写出如下的代码(不过题目里有一个坑,它没规定数据的范围,所以最好用尽量大的范围。。比如longlongint。。。)
代码:
#include<stdio.h>
int main()
{
__int64 a,n,m,i,s,sum;
while(scanf("%I64d%I64d",&n,&m)!=EOF)
{
s=(n-1);///两端的距离。。
sum=0;
for(i=0;i<m;i++)
{
scanf("%I64d",&a);
if(a>=2)
{
sum+=s;
s-=2;
}
}
printf("%I64d\n",sum);
}
return 0;
}