【BZOJ 1148】【CTSC 2008】挂缀【BZOJ 1 148】【CTSC 2008】挂缀

【BZOJ 1 148】【CTSC 2008】挂缀

这题显然是个贪心,然而我们应该如何贪才能得到最优解= =。。。。

假设我们按重量升序贪心,那我们可以得到反例(假设在挂缀底部):设有i,j,j<i且W_j<W_i

那么当C_i<W_j,W_i<C_j时,应该选i而不是j

假设我们按拉力升序贪心,依旧可以得到反例(假设在挂缀顶部,S为链以下重量和):设有i,j,j<i,且C_j<C_i

那么当C_i<S+W_j,S+W_i<C_j时,应该先选i当第二高的,而非链顶

= =那如何贪心呢,观察以上两个式子,我们发现C_i+W_i<C_j+W_j,于是我们按$C+W$拍升序贪心。然而这样我们只保证了第一问,第二问需要我们维护原链中最大重量。贪心策略是,能挂到当前链顶就挂,不能挂重量看是否小于链中最大重量,小于则替换(由于排序的方法,替换的挂缀C值只能大于原位置C值,因此可替换),复杂度O(n
log n)code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct hq{
    long long wgt,f,sum;
    bool operator <(hq const &a) const
      {return sum<a.sum;}
}a[1000001];
int n;
long long nowwgt=0,nowl=0;
priority_queue<int> q;
int main()
{
    int i;
    scanf("%d",&n);
    for (i=1;i<=n;++i)
      {
        scanf("%I64d%I64d",&a[i].f,&a[i].wgt);
        a[i].sum=a[i].f+a[i].wgt;
      }
    sort(a+1,a+n+1);
    for (i=1;i<=n;++i)
      {
        if (nowwgt<=a[i].f) {q.push(a[i].wgt); nowl++; nowwgt=nowwgt+a[i].wgt;}
        else if (q.top()>a[i].wgt) {nowwgt=nowwgt-q.top()+a[i].wgt; q.pop(); q.push(a[i].wgt);}
      }
    printf("%lld\n%lld\n",nowl,nowwgt);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 03:43:13

【BZOJ 1148】【CTSC 2008】挂缀【BZOJ 1 148】【CTSC 2008】挂缀的相关文章

磁盘管理,磁盘挂在mount,挂载光盘镜像文件,挂在U盘,umount 卸载命令, dd

1 mount 命令格式: mount[-t vfstype] -o options device dir 其中: *-t vfstype 指定文件系统的类型,通常不必指定.mount会自动选择正确的类型.常 用类型有: 光盘或光盘镜像:iso9660 DOSfat16文件系统:msdos Windows9x fat32文件系统:vfat WindowsNT ntfs文件系统:ntfs MountWindows文件网络共享:smbfs UNIX(LINUX)文件网络共享:nfs *-o opti

【JSOI 2008】【BZOJ 1014】火星人prefix

这题其实很奇怪,一眼看出fhq treap+字符串hash... 结果在BZOJ被卡常了,结果学长告诉我了一些优化,有些自己还不会写,只写了inline和吧unsigned long long改为unsigned int... 结果时间少了一半,谁能告诉我为什么... #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm>

【凸壳】【HNOI 2008】【bzoj 1007】水平可见直线

1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 4567 Solved: 1686 Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线: L1:y=x; L2:y=-x; L3:y=0 则L1和L2是可见的,L3是被覆盖的. 给出n条直线,表示成y=Ax+B的形式(|A|,|

【SHOI 2008】【BZOJ 1018】堵塞的交通traffic

发现很多有关区间联通问题的题线段树都可以做,不论是1列还是2列.这题的易错点在于两个端点x,y之间的可行路径不一定在区间[x,y]之间,有可能是从其他区间绕过来的,想明白这一点,区间的更新又与1列的情况基本类似,这题就很好做了. code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define mid (l+r)/2 #define lch i<

【JSOI 2008】【BZOJ 1016】最小生成数计数

这题题目中有一个很显眼的提示,每种权值的边不会超过10条,这提示我们可以采用些暴力方法. 首先在每个最小生成树中有两个结论: 1.每种权值的边数相等. 2.每种权值所选边构建后图的联通形态相同. 1比较好理解,若1不成立,则最小生成树总权值不固定. 2可以通过Kruskal算法流程来理解. code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using

【线段树】【JSOI 2008】【bzoj 1012】最大数maxnumber

1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 5996 Solved: 2589 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),

【乱搞】【HNOI 2008】【bzoj 1011】遥远的行星

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 2640 Solved: 954 Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的受力,只要结果的相对误差不超过5%即可.

【斜率优化】【HNOI 2008】【bzoj 1010】玩具装箱toy

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Submit: 7449 Solved: 2854 Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1-N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个

【最小染色】【HNOI 2008】【bzoj 1006】神奇的国度

1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 2446 Solved: 1101 Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2-An之间仅存在N对认识关系:(A1A2)(A2A3)-(AnA1),而没有其