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 ...
随机推荐
- FFmpeg源码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- Oracle oledb 打包并集成到程序安装包(VC ADO訪问Oracle)
近期有一个项目和oracle交互,我用的是ADO的方式进行试问操作. 首先把数据库连接的东东记录一下,老了记性不好啊! 操作例如以下: //连接串这么写的话就能够不用配置 tnsnames.ora配置 ...
- 不使用while,for,if等实现加法
不使用if, while,for,switch等实现从1到10的加法 解:这里使用静态函数和静态变量实现,利用类似的方法也能够实现从1打印到1000 class TheSum{ public: The ...
- 系统安全-LDAP
LDAP服务器 1.目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好像Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不同,它有优异的读性能 ...
- 基于websocket实现的web聊天室
# -*- coding:utf-8 -*- import socket import base64 import hashlib def get_headers(data): "" ...
- linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换
用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int ...
- crm操作销售订单实体
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Cr ...
- [转]JavaScript
javascript 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border on ...
- Java Base64加密、解密原理Java代码(转载)
博客来源:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是网络上最常见的用于传输8Bit字节代码的编码方 ...
- iOS开发---- 开发错误汇总及解决方法
本文转载至 http://blog.csdn.net/shenjx1225/article/details/8561695 一.今天调试程序的时候,出现了一个崩溃,信息如下: 2013-02-01 0 ...