合并游戏

合并游戏

merge.cpp/c/pas

(1s/256M)

 

题目描述

Cindy和Dan在玩一个游戏。

一开始Cindy想出了N个数,接着她把这N个数全部给了Dan。

Dan得到这组数后,它会挑出3个数(如果不足3个则全部挑出)。Dan会把这几个数加起来变成一个数,然后再把这个数与剩下的数再放到一起。Dan会一直这样做,直到最后只剩下一个数。

Cindy则会在旁边记下每次Dan得到的数,她把这些数加起来,作为本次游戏的得分。她想知道,对于一组数,Dan能得到的最大的得分是多少?

输入格式

第一行一个正整数N,代表这组数的个数;

第二行N个正整数,代表这N个整数。

输出格式

一行一个整数,代表可能的最大得分。

样例输入(merge.in)

4

3 1 5 6

样例输出(merge.out)

29

样例解释

Dan可以首先把(3,5,6)这三个数先合并起来,得到3 + 5 + 6 = 14; 接着他把剩下的两个数再合起来,得到1 + 14 = 15.这样,总得分是最大的 14 + 15 = 29.

数据范围与限制

对于50%的数据,N<=10

对于100%的数据,N<=1000,所有数不大于1000

~\(≧▽≦)/~啦啦啦思路:

要所求值最大,就先按降序排个序,然后一次加起来就是最大,如果是在两个或以下个数中选择就特判一下。

(v)~ 代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 int n,a[1001],b[1001],ans,num,tot,q;
 8
 9 int cmp(int a,int b){
10     return a>b;
11 }
12
13 int main(){
14
15     memset(a,-1,sizeof(a));
16     int head=1,tail=head+2;
17     cin>>n;
18
19     for(int i=1;i<=n;i++){
20         cin>>a[i];
21     }sort(a+1,a+n+1,cmp);
22
23     do{
24         for(int i=head;i<=tail;i++) {
25             num+=a[i];
26             a[i]=-1;
27         }a[tail]=num;
28         ans+=a[tail];
29         head+=tail-1;
30         tail=head+2;
31         for(int i=1;i<=n;i++)
32           if(a[i]!=-1) tot++;
33     } while(tot>=3);
34
35     for(int i=1;i<=n;i++)
36         if(a[i]!=-1) tot++;
37
38     if(tot<3){
39         for(int i=1;i<=n;i++)
40         if(a[i]!=-1)  q=i;
41         ans+=a[q]+a[q+1];
42     }
43
44     cout<<ans<<endl;
45     return 0;
46 }
时间: 2025-01-08 09:10:15

合并游戏的相关文章

NYOJ 832 合并游戏

合并游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 大家都知道Yougth除了热爱编程之外,他还有一个爱好就是喜欢玩.某天在河边玩耍的时候,他发现了一种神奇的石子,当把两个石子放在一起的时候,后一个石子会消失,而且会蹦出一定数量的金币,这可乐坏了Yougth,但是他想得到最多的金币,他该怎么做? 输入 首先一行,一个n(1<=n<=10),表示有n个石子.接下来n*n的一个矩阵,Aij表示第i个和第j个合并蹦出的金币值(小于10000,注意合并后j会消失).

nyoj832 合并游戏(状态压缩DP)

题意 : n个石子, 给你一个n*n矩阵, A[i][j]表示第i个和第j个合并蹦出的金币值, 合并完石子 j 消失.求合并所有石子后,所得的最大金币数. 分析 :     1. 题中给的数据范围  n(1<=n<=10)  也就是说最多10个石子, 那么我们不妨用一个二进制串来表示合并的状态,1表示没被合并,0表示合并后消失了,例如    (1001)四个石子第2.3个被合并了.     2. 用d[x]来存储合并到x状态时,所得的最大金币数,例如 d[1001] 表示合并2 , 3 后所得

NYOJ832 合并游戏(简单状压DP)

AC代码: #include<stdio.h> #include<string.h> #define max(a,b) (((a)>(b))?(a):(b)) int dp[10000],a[12][12],n; int dj(int x){ int i,j,temp,Mx=0,mx; if(dp[x]!=-1) return dp[x]; //搜过的状态要标记, 这要注意!! 不写的话会超时 if(x==0) return 0; for(i=0;i<n;i++){ m

大数常用计算模板及例题

一.模板&例题 [两个大数相加] string sum(string s1,string s2) { if(s1.length()<s2.length()) { string temp=s1; s1=s2; s2=temp; } int i,j; for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) { s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节 if(s1[i]-'0'>=10)

第七届省赛赛前交流赛部分题解

A题: Yougth's Game[Ⅲ]( 区间dp ) 这是在省赛前热身赛出的题目,可能是题目中有用到博弈的思想,很多人都在做,而且在尝试暴力.但是没有人往dp的方向上想. 题目类型:动态规划+博弈 分析:题意描述的很清楚,就是选择在两端取数,当前取的数不仅能够影响下一次的结果,而且能够影响后面的结果...又是一个求最优值,那么是不是可以往dp的方向上想了.区间dp 定义状态dp[ i ] [ j ] 为从 i 到 j 上A的得分,那么B的得分就是sum(i,j)-dp[ i ] [ j ]

[转载]网络游戏的同步

[转自margincc的cnblogs 2010-12-18 13:13 ,如果涉及到侵权请及时联系我们,一经确认会在第一时间删除~不过我们是出于学习的目的,小组里面6个人只有我一个打酱油的恳请各位大大高抬贵手!] 近期完成一个稍稍涉及网络同步的游戏,结合网络上查到的一点资料和自己的心得做个小结. 游戏描述:略形象的归纳为地图中5个玩家在5个不同位置消息,地图中有20个道具,玩家选择出发时间,出发角度和出发速度去奔向某道具.现在玩家1向server发消息,准备从当前currposition出发,

网络游戏的同步

近期完成一个稍稍涉及网络同步的游戏,结合网络上查到的一点资料和自己的心得做个小结. 游戏描述:略形象的归纳为地图中5个玩家在5个不同位置消息,地图中有20个道具,玩家选择出发时间,出发角度和出发速度去奔向某道具.现在玩家1向server发消息,准备从当前currposition出发,对应的currtime,currangle,currspeed都确定,假定前方有prop1,现在服务器收到消息currservertime,然后广播玩家1的出发,那么玩家2,玩家3,玩家4,玩家5可能又由于网络原因接

[转载自CSDN] 网络游戏同步法则

出处 http://blog.csdn.net/skywind/article/details/392461 ----------------------------- 网路的硬件也有限,而人的创造也无限,在公网平均130ms的Latency下,是不存在“完全的”的同步情况.如何通过消除/隐藏延时,将用户带入快速的交互式实时游戏中,体验完美的互动娱乐呢? 以下六点,将助你分清楚哪些我们可以努力,哪些我们不值得努力,弄明白实时游戏中同步问题关键之所在,巧妙的化解与规避游戏,最终在适合普遍用户网络环

网络游戏同步法则

网路的硬件也有限,而人的创造也无限,在公网平均130ms的Latency下,是不存在“完全的”的同步情况.如何通过消除/隐藏延时,将用户带入快速的交互式实时游戏中,体验完美的互动娱乐呢? 以下六点,将助你分清楚哪些我们可以努力,哪些我们不值得努力,弄明白实时游戏中同步问题关键之所在,巧妙的化解与规避游戏,最终在适合普遍用户网络环境中(200ms),实现实时快速互动游戏: 1. 基本情况:(A) 网络性能指标一:带宽,限制了实时游戏的人数容量(B) 网络性能指标二:延时,决定了实时游戏的最低反应时