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(贪心)的更多相关文章

  1. hdu 6011 Lotus and Characters 贪心

    http://acm.hdu.edu.cn/showproblem.php?pid=6011 先把数字从小到大排好,比如是-6.3.4这样, 然后处理出后缀和,当后缀和 <= 0的时候马上停止就 ...

  2. hdu 4825 Xor Sum(trie+贪心)

    hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. #include ...

  3. Best Coder Lotus and Characters

     Lotus and Characters  问题描述 Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的串. 定义串的价值为:第1位字母的价值*1+第2位字母的 ...

  4. HDU 5744 Keep On Movin 贪心

    Keep On Movin 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5744 Description Professor Zhang has k ...

  5. BestCoder Round #91 1001 Lotus and Characters

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6011 题意: Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的 ...

  6. HDU 6034 Balala Power!(贪心+排序)

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  7. HDU 5813 Elegant Construction (贪心)

    Elegant Construction 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5813 Description Being an ACMer ...

  8. HDU 5802 Windows 10 (贪心+dfs)

    Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...

  9. HDU 5500 Reorder the Books 贪心

    Reorder the Books Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

随机推荐

  1. 关于hibernate组件配置

    建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系.以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息单独放在一张表中,然后建立员工 ...

  2. WPF ListView 居中显示

    原文:WPF ListView 居中显示 今天遇到的问题: 方法1:设置GridViewColumn的ActualWidth <ListView > <ListView.View&g ...

  3. [WPF]获取鼠标指针下的元素

    原文:[WPF]获取鼠标指针下的元素   [WPF]获取鼠标指针下的元素 周银辉 以前写过一些GetElementUnderMouse之类的函数,要用到坐标换算而显得有些麻烦(特别是当元素有XXXTr ...

  4. XF警告试图

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. x:Static

    用途:访问代码中的变量等 后台定义一个变量 public partial class GetStaticFromBackgroundCode : Window { public static stri ...

  6. C# 特性的使用

    using ClassLibrary;using System;using System.Collections.Generic;using System.Linq;using System.Refl ...

  7. net share列出了Windows的默认共享(包括C盘)

    另外还有单独开启办法: 开启共享方法: 命令行方式:net share 博客=F:\娱乐\种子 我设置了一个名为“博客”的共享,路径为:“F:\娱乐\种子”. GUI方式:找到“F:\娱乐”的“种子” ...

  8. HTTP协议学习 - 9 Method Definitions

    # 前言 官方文档简略翻译.9 不是代表第九篇,而是在 RFC2616 中是第九篇.重要加粗,龟速翻译. # Method 9.3 GET The GET method means retrieve ...

  9. [原译]实现IEnumerable接口&理解yield关键字

    原文:[原译]实现IEnumerable接口&理解yield关键字 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享.请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢 ...

  10. 安装CUDA和cuDNN

    GPU和CPU区别 1,CPU主要用于处理通用逻辑,以及各种中断事物 2,GPU主要用于计算密集型程序,可并行运作: NVIDIA 的 GeForce 显示卡系列采用 GPU 特性进行快速计算,渲染电 ...