HDU 6011:Lotus and Characters(贪心)
http://acm.hdu.edu.cn/showproblem.php?pid=6011
题意:共有n种字符,每种字符有一个val和一个cnt,代表这个字符的价值和数量。可以制造的总价值是:第一个字符的权值*1+第二个字符的权值*2+第三个字符的权值*3+……。问最大的总价值可以是多少。
思路:首先可以确定价值越大的是放在越后,因为后面的位权比较大。考虑到价值有负数,因为不确定负数是否要放上去,所以需要枚举这些负数。
首先输入的时候记录价值为负的个数negnum。将价值从小到大排序,然后枚举1~negnum+1,用一个beg记录当前枚举哪种字符,还有tol记录当前种类的字符用了多少次了。如果当前种类的字符数用完了,就要将beg+1了,这样一直枚举下去,取最优。至于枚举到negnum+1的原因,是因为还要算一个负数都不取的情况会不会更优。计算的话可以通过等差数列求和公式(一个一个枚举怕超时,实际上看别人没超时)。至于在比赛时候WA的原因,因为粗心。。忘了只有枚举到的种类是beg的时候才要减去tol,其他不用。(比赛的时候所有都减去了tol,血崩)。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;
#define N 1010
#define M 200010
#define INF 0x3f3f3f3f
typedef long long LL;
struct node {
int val, cnt;
} p[]; bool cmp(const node &a, const node &b) { return a.val < b.val; } LL cal(int val, int cnt, int now) { // 等差数列
int n = cnt + now;
LL ans = val * n + (n * (n - )) / * val;
ans -= val * now + (now * (now - )) / * val;
return ans;
} int main() {
int t;
scanf("%d", &t);
while(t--) {
int n;
scanf("%d", &n);
int negnum = ;
for(int i = ; i <= n; i++) {
scanf("%d%d", &p[i].val, &p[i].cnt);
if(p[i].val < ) negnum += p[i].cnt;
}
sort(p + , p + + n, cmp);
LL ans = , tmp = ; int now = ;
int beg = , tol = ;
for(int i = ; i <= negnum + ; i++) { // 因为要看所有正数的情况,所以需要+1
now = ; tmp = ;
for(int k = beg; k <= n; k++) {
if(k == beg) tmp += cal(p[k].val, p[k].cnt - tol, now);
else tmp += cal(p[k].val, p[k].cnt, now);
if(k == beg) now += p[k].cnt - tol;
else now += p[k].cnt;
}
if(ans < tmp) ans = tmp;
tol++;
if(tol == p[beg].cnt) { beg++; tol = ; }
}
printf("%I64d\n", ans);
}
return ;
}
HDU 6011:Lotus and Characters(贪心)的更多相关文章
- hdu 6011 Lotus and Characters 贪心
http://acm.hdu.edu.cn/showproblem.php?pid=6011 先把数字从小到大排好,比如是-6.3.4这样, 然后处理出后缀和,当后缀和 <= 0的时候马上停止就 ...
- hdu 4825 Xor Sum(trie+贪心)
hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. #include ...
- Best Coder Lotus and Characters
Lotus and Characters 问题描述 Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的串. 定义串的价值为:第1位字母的价值*1+第2位字母的 ...
- HDU 5744 Keep On Movin 贪心
Keep On Movin 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5744 Description Professor Zhang has k ...
- BestCoder Round #91 1001 Lotus and Characters
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6011 题意: Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的 ...
- HDU 6034 Balala Power!(贪心+排序)
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- HDU 5813 Elegant Construction (贪心)
Elegant Construction 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5813 Description Being an ACMer ...
- HDU 5802 Windows 10 (贪心+dfs)
Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...
- HDU 5500 Reorder the Books 贪心
Reorder the Books Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
随机推荐
- 在WPF里面实现以鼠标位置为中心缩放移动图片
原文:在WPF里面实现以鼠标位置为中心缩放移动图片 在以前的文章使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果里面,介绍了如何在WPF里面移动和放大缩小图片, ...
- 反编译 war 包成传统项目的方法
需求 项目老大让外包做了官网,不甚满意,想自己搞搞,遂叫我反编译他们发过来的 war 包. 方法 第一步:解压 war 包其实就是 zip 压缩包,用 zip 解压. 第二步:反编译 查看 war 包 ...
- StepShot4.3.0安装包_KeyGen发布
StepShot是一个可以方便快速的制作操作手册的软件,功能相当强悍. 请低调使用. -------------------------------华丽的分割线-------------------- ...
- Windows NT WinLogon Notify
在NT系列Windows操作系统中,恶意软件可以通过关联Winlogon特定的事件来使自身被启动,如Lock,Logoff,Logon,Shutdown,StartScreenSaver,StartS ...
- Codejock.Xtreme.Toolkit.Pro.v15.3.1 下载 与 VS2015补丁使用方法
Codejock.Xtreme.Toolkit.Pro.v15.3.1 下载 与 VS2015补丁使用方法 打算放在CSDN进行下载的,上传完成后发现资源分设置的1分,本打算赚点下载分的.在页面上没有 ...
- delphi文件操作(比较全)
Delphi中默认有input和output两个文件变量,使用可以不用定义,直接使用. 但: input:只读.output:只写.用时注意以免引起异常. 文件是由文件名标识的一组数据的集合,文件通常 ...
- 改善C#程序的建议6:在线程同步中使用信号量
原文:改善C#程序的建议6:在线程同步中使用信号量 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两 ...
- 手机控制PPT good
以前做了一个小东西,通过手机来控制PPT的翻页,最大化和最小化,东西很简单,近期整理电脑发现了拿来和大家分享一下 主要分为两个部分,客户端和服务器 客户端实现 当初考虑到跨平台的特性就选择了qt来写的 ...
- CDC-更改数据捕获存储过程 (Transact-SQL)-学习
背景: 在SQLServer2008之前,对数据变更的捕获通常使用触发器.时间戳等低效高成本的功能来实现,所以很多系统都没有做数据变更或者仅仅对核心表做监控. 适用环境: 仅在SQLServer200 ...
- 记住以下10条,Linux磁盘与文件系统管理无忧矣
1.查看当前Linux系统所支持的文件系统:ls -l /lib/modules/$(uname -r)/kernel/fs:目前已加载到内存中支持的文件系统:cat /proc/filesystem ...