刷题记录:牛客NC21841牛牛玩平板
传送门:
题目描述:
牛牛和牛妹喜欢玩平板游戏,游戏一开始屏幕上会出现很多个图形,玩家在每一轮可以合并两个图形,当只有一 个图形的时候游戏结束,每个图形都有一个大小,合并完成后的图形的大小为x+y,x和y分别为合并之前的两个图 形,与此同时,玩家会获得x*y的分数。 牛牛和牛妹新开了一盘游戏,屏幕上出现了n个图形,每个图形的大小已知,请算出牛牛和牛妹最大能获得的分 数 输入: 3 1 2 3 输出: 11
又是一道一星的贪心题
主要思路: 对于这类题目,我们首先就有这么的一种普遍思路,有一种冥冥中的感觉让我觉得如果我们将其排个序的话从大到小一次进行操作的话得到的答案应该是最优的吧,证明也应该是可以证明的,此处暂时略过(我们稍微的想一想大的利用次数越多是不是答案肯定就越优秀呢),然后我们就可以快乐的解决这道题目了QAQ
注意:此题似乎可以不开long long,但是以防万一,建议使用long long
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <set> #include <queue> #include <string.h> #include <stack> using namespace std; typedef long long ll; #define inf 0x3f3f3f3f #define root 1,n,1 #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 inline ll read() { ll x=0,w=1;char ch=getchar(); for(;ch>9||ch<0;ch=getchar()) if(ch==-) w=-1; for(;ch>=0&&ch<=9;ch=getchar()) x=x*10+ch-0; return x*w; } #define maxn 1000000 int n; int a[200]; ll ans=0; bool cmp(int a,int b) { return a>b; } int main() { n=read(); for(int i=1;i<=n;i++) a[i]=read(); sort(a+1,a+n+1,cmp); for(int i=2;i<=n;i++) { ans+=(a[i]*a[i-1]); a[i]=a[i]+a[i-1]; } cout<<ans<<endl; return 0; }
下一篇:
用友:递归查询链表倒数第k个节点