[原]图标排列-2011百度之星初赛第一题解答

初赛A:

第一题:

图标排列

描述

百度应用平台上有很多有趣的应用,每个应用都由一个开发者开发,每个开发者可能开发一个或多个应用。百度的工程师们想把应用尽可能好的推荐给用户。

研究发现,同一个开发者开发的程序的图标有很大的相似性。如果把同一个开发者开发的应用放在一起,用户很快就会厌倦相似的图标,如果把这些图标穿插摆放效果就会好很多。

现在工程师想给用户推荐来自m个开发者的n个应用,在推荐的时候这些应用的图标将排成整齐的一行展示给用户,相邻两个图标之间的距离正好是1,工程师们想让这些图标尽可能的穿插摆放。为了衡量穿插摆放的效果,给每个图标定义一个分离度,分离度的值是指当前图标和它左边最近的来自同一个开发者的图标之间的距离。如果一个图标左边没有来自同一个开发者的图标,则分离度为0。所有图标穿插摆放效果的值定义为所有图标的分离度之和。

已知每个开发者开发的应用个数,请帮助百度的工程师找到图标穿插摆放效果的最大值。

 

输入

输入的第一行包含两个整数nm,用一个空格分隔,分别表示应用的个数和开发者的个数。

第二行包含m个正整数,相邻两个数之间用一个空格分隔,表示每个开发者开发的应用个数,这些整数之和必然等于n

 

输出

输出一个整数,表示图标穿插摆放效果的最大值。

 

样例输入

8 3

3 3 2

 

样例输出

15

提示

对于20%的数据,n≤ 10

对于40%的数据,n≤ 100

对于100%的数据,1≤ m ≤ n ≤ 100,000

算法如下:

 

#include<iostream>
using namespace std;
/*
@author tilltheendwjx
@blog http://blog.csdn.net/wjh200821或者http://www.cnblogs.com/tilltheendwjx/ 
*/ 
int sumof1(int *data,int s)
{
    int j=0;
    int t=0; 
    for(j=0;j<s;j++)
    {
        if(data[j]==1||data[j]==0)
            t++;  
        if(data[j]!=0)
            data[j]--;   
    }
    return s-t;
}
int sumoficons(int *data,int s)
{   
    int w=sumof1(data,s);
    if(w==0)
       return 0;
    return w*s+sumoficons(data,w);
}
int main()
{
    int n,m;
    int *data;
    int j;
    cin>>n>>m;
    data=new int[m];
    j=0;
    for(j=0;j<m;j++)
    {
        cin>>data[j];
    }
    cout<<sumoficons(data,m)<<endl;
    system("pause");   
    return 0;
} 

 

  

 


作者:wjh200821 发表于2012-5-13 19:43:23 原文链接
阅读:5 评论:0 查看评论

posted on 2012-05-13 19:43  tilltheendwjx  阅读(490)  评论(0编辑  收藏  举报

导航