蓝桥杯 ALGO-225 算法训练 石子游戏

蓝桥杯 ALGO-225 算法训练 石子游戏

题目:问题描述
  石子游戏的规则如下:
  地上有n堆石子,每次操作可选取两堆石子(石子个数分别为x和y)并将它们合并,操作的得分记为(x+1)×(y+1),对地上的石子堆进行操作直到只剩下一堆石子时停止游戏。
  请问在整个游戏过程中操作的总得分的最大值是多少?
输入格式
  输入数据的第一行为整数n,表示地上的石子堆数;第二行至第n+1行是每堆石子的个数。
输出格式
  程序输出一行,为游戏总得分的最大值。
样例输入
10
5105
19400
27309
19892
27814
25129
19272
12517
25419
4053
样例输出
15212676150
数据规模和约定
  1≤n≤1000,1≤一堆中石子数≤50000

处理策略:每次都选出石子个数最多的两堆合并
要想最后的得分最大,就需要让最大的石子数参与尽可能的运算,所以每次都选出石子个数最多的两堆合并,循环次操作n-1次,直至最后只剩一堆石子

#include 
#include 
#include 
#include 
#define maxnum 1005
using namespace std;
int main()
{
    long long res=0,one = 0,two = 0,a[maxnum];  //注意:a[maxnum]数组需设为long long 型
    int n;
    int one_location=1,two_location=1;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<n-1;i++)   //n-1次合并使n堆石子合并为1堆石子
    {
         for(int j=0; j<n; j++)  
         {
             if(a[j])
             {
                 if(a[j] > one)
                {
                    one = a[j];
                    one_location = j;
                }
                if(one > two)  //保证one始终比two小
                {
                    //若one比two大,交换one和two以及one和two的位置
                    one = one+two;
                    two = one-two;
                    one = one-two;
                    one_location = one_location+two_location;
                    two_location = one_location-two_location;
                    one_location = one_location-two_location;
                }
             }
         }
         res+=(a[one_location]+1)*(a[two_location]+1);
         a[one_location]+=a[two_location];  //将最大的两堆石子合并
         a[two_location]=0;
         two = one = 0;
    }
    cout<<res;
    return 0;
}

你可能感兴趣的:(蓝桥杯)