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 ;
}

最新文章

  1. 【bzoj1708】[USACO2007 Oct]Money奶牛的硬币
  2. 【控制iOS7兼容iOS6 状态栏的显示不完全 简单缩写】
  3. 学习OpenCV——用OpenCv画漫画
  4. SVN使用汇总
  5. 如何用pdfbox-app-1.8.10.jar批处理将pdf文档转换成text文档
  6. 数据库MySQL-Oracle-DB2-SQLServer分页查询
  7. 自己编写的 C++ 超轻量级日志类
  8. TCP传输协议使用
  9. Python 继承和组合 接口
  10. 如何批量添加图片到ppt的方法
  11. JavaScript setInterval(定时/延时调用函数)
  12. 数字签名-MD5
  13. ABAP 字符串函数
  14. CF Round #510 (Div. 2)
  15. SpringBoot开发项目,引入JPA找不到findOne方法
  16. XDocument 使用
  17. bzoj千题计划161:bzoj1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果
  18. C++11 lambda 表达式解析
  19. WebGl 旋转(矩阵变换)
  20. 安装CentOS版本的yum(转载)

热门文章

  1. 精装友好联络算法实现借壳和RI
  2. EF延迟加载LazyLoading
  3. XF堆栈布局
  4. WPF 验证错误模板
  5. sql分组统计多列值
  6. MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: &quot;Too many connections&quot;
  7. ASP.NET Core 下自定义模型绑定,去除字符串类型前后的空格
  8. uniConnection断线重联(tag属性颇有深意,这样就可以在某些情况下,不用继承实现新控件就可以达到自己的目的)
  9. Qt第三方圆形进度条-及其改进
  10. asp.net mvc中使用jquery H5省市县三级地区选择控件