Lotus and Characters (stronger)
题意:
有n类物品,第i种物品权值为$val(i)$,有$cnt(i)$个,现在你可以选出一些物品排成一个序列(假设有m个),
记第i个物品种类为$x_i$,最大化$\sum_{i=1}^m{i * val(x_i)}$
解法:
只要将物品分为两类即可。
对于$val(i) \ge 0$的直接从小到大排列插入序列末端即可,然后在序列首端插入物品,
记当前后缀和为$suffixsum$。
接下来从大到小插入$val(i)<0$的物品,每插入一个会产生$suffixsum+val(i)$的答案贡献,并且影响$suffixsum$
贪心正确性显然,接下来考虑加速插入物品的过程,
一次性插入t个i类物品不更新$suffixsum$对答案的贡献为$t*suffixsum + \frac{t*(t+1)}{2}*val(i)$,
且有$t \le \frac{-suffixsum}{val(i)}$。
从而$O(nlogn)$解决此问题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> #define N 1010
#define LL long long using namespace std; int val[N],cnt[N],a[N]; bool cmp(int a,int b)
{
return val[a]<val[b];
} LL S(LL n)
{
return n*(n+1LL)/2LL;
} int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&val[i],&cnt[i]),a[i]=i;
sort(a+,a+n+,cmp);
int sum=;
LL ans=,suffix_sum=;
for(int i=;i<=n;i++)
{
if(val[a[i]]<) continue;
sum += cnt[a[i]];
ans += (S(sum)-S(sum-cnt[a[i]])+0LL) * (LL)val[a[i]];
suffix_sum += cnt[a[i]] * (LL)val[a[i]];
}
for(int i=n;suffix_sum> && i>=;i--)
{
if(val[a[i]]>=) continue;
LL tmp = (-suffix_sum)/val[a[i]];
tmp = min(tmp, (LL)cnt[a[i]]);
ans += tmp*suffix_sum + S(tmp)*val[a[i]];
suffix_sum += tmp*val[a[i]];
}
cout << ans << endl;
}
return ;
}
Lotus and Characters (stronger)的更多相关文章
- Best Coder Lotus and Characters
Lotus and Characters 问题描述 Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的串. 定义串的价值为:第1位字母的价值*1+第2位字母的 ...
- BestCoder Round #91 1001 Lotus and Characters
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6011 题意: Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的 ...
- hdu 6011 Lotus and Characters 贪心
http://acm.hdu.edu.cn/showproblem.php?pid=6011 先把数字从小到大排好,比如是-6.3.4这样, 然后处理出后缀和,当后缀和 <= 0的时候马上停止就 ...
- HDU 6011:Lotus and Characters(贪心)
http://acm.hdu.edu.cn/showproblem.php?pid=6011 题意:共有n种字符,每种字符有一个val和一个cnt,代表这个字符的价值和数量.可以制造的总价值是:第一个 ...
- OI 刷题记录——每周更新
每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...
- LeetCode[3] Longest Substring Without Repeating Characters
题目描述 Given a string, find the length of the longest substring without repeating characters. For exam ...
- [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串
Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...
- [LeetCode] Sort Characters By Frequency 根据字符出现频率排序
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
- [LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串
Given a string, find the length of the longest substring T that contains at most k distinct characte ...
随机推荐
- Failure [INSTALL_FAILED_ALREADY_EXISTS]
1.发生原因 做unity开发的同事说apk无法安装,要我帮忙看下,然后我通过命令adb install安装apk,出现此提示 2.解决过程 首先想到的仍然是安装包已存在的问题,结果使用清理类软件清理 ...
- vs2010中添加dll文件
1.更改设置 1.1 project->properties->configuration properties->C/C++->General->Addtional ...
- bootstrap table api
http://blog.csdn.net/rickiyeat/article/details/56483577
- Java链接MySql数据库(转)
import java.sql.*; public class JDBCTest { public static void main(String[] args){ // 驱动程序名 String d ...
- Web性能测试工具:Siege安装&使用简介
在Web性能测试工具中,siege是比较热门和常见的,它有安装简单,使用简单,测试报告详细的特点. 并且可以在文本中预定义一系列待测试url模拟,并可设定一定并发量下持续指定时间or测试进行测试. 比 ...
- android检测当前网络是否可用
在android程序中运行第一步就是检测当前有无可用网络 如果没有网络可用就退出程序 if (isConnect(this)==false) { ...
- Vue 向下扩展后就类似于 jQuery
https://cn.vuejs.org/v2/guide/comparison.html
- android实现跑马灯效果
第一步:新建一个新项目,MarqueeTextView 首先为了观察到跑马灯效果,将要显示的文字极可能 写长.在strings.xml目录里面将 <string name="hello ...
- 火狐浏览器使用firebug获取xpath和css path
工作中,常常会用到网页元素的定位方式,常用的有xpath和css path两种定位方式. 现在简单介绍如何使用工具自动生成元素的定位字符串. 首先介绍在火狐浏览器上使用FireBug及其扩展FireP ...
- Oracle序列更新为主键最大值
我们在使用 Oracle 数据库的时候,有时候会选择使用自增序列作为主键.但是在开发过程中往往会遇到一些不规范的操作,导致表的主键值不是使用序列插入的.这样在数据移植的时候就会出现各种各样的问题.当然 ...