UVALive 4850 Installations
题目大意:有若干个任务,每个任务耗时si,期限为di,同一时间只能做一个任务。对于一个任务,惩罚值为max(0,完成时间-期限)。问怎么安排,使(最大惩罚值+次大惩罚值)最小,O(n^2)。
如果没有次大惩罚值,就是一个很显然的贪心了:把任务按di排序,di相同按si排序,一路平推过去。
这样可以保证最大值最小,但不能保证(最大+次大)最小。好在这题有十分良心的样例:

仔细观察一下样例,你会发现:基本上也是按照上面的逻辑做任务,但J2和J6换了一个位置。
还有一件非常巧合的事情:J2和J6就是答案。
观察一下完全按照上面逻辑做的情况,发现答案是8,最大值是J6(5),次大值是J2(3)。
然后把J2换到J6右边,就变成最大值J2(6),次大值J6(1)。
提示我们可以通过把一个前面的拿出来,扔到原先最大/次大的后一个去。
分析一下这样做的结果:后半截不变,拿出来的变成最大值,原来的最大值、次大值减小并作为次大值,最终结果可能会比原答案小。
看一下数据,枚举,O(n^2)就可以了。
为什么只拿一个就可以了呢?因为拿两个就肯定比不拿要大了(第一次拿出的超过原次大值,第二次的超过原来的最大值)。
要不是有样例我一年都想不出这个
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <complex>
#include <stack>
#define LL long long int
#define dob double
#define FILE "4850"
using namespace std; const int N = ;
struct Pair{
int t,r;
bool operator <(const Pair &p)const{
if(r==p.r)return t<p.t;
return r<p.r;
}
}A[N];
int n,id,Ans,L[N],R[N]; inline int gi(){
int x=,res=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')res*=-;ch=getchar();}
while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
return x*res;
} inline int getmxp(){
int sum=,mxp=,nmxp=;id=;
for(int i=R[],p;i<=n;i=R[i]){
sum+=A[i].t;p=max(,sum-A[i].r);
if(p>=mxp)nmxp=mxp,mxp=p,id=i;
else if(p>=nmxp)nmxp=p,id=i;
}
return mxp+nmxp;
} inline void solve(){
n=gi();R[]=;L[n+]=n;
for(int i=;i<=n;++i)
A[i].t=gi(),A[i].r=gi(),L[i]=i-,R[i]=i+;
sort(A+,A+n+);Ans=getmxp();
if(!Ans){printf("0\n");return;}
for(int i=R[],j=id;i!=j;i=R[i]){
int l=L[i],r=R[i];
R[l]=r;R[i]=R[j];R[j]=i;
Ans=min(Ans,getmxp());
R[j]=R[i];R[l]=i;R[i]=r;
}
printf("%d\n",Ans);
} int main()
{
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
int Case=gi();while(Case--)solve();
fclose(stdin);fclose(stdout);
return ;
}
Installations
UVALive 4850 Installations的更多相关文章
- UVALive 4850 Installations 贪心
题目链接 题意 工程师要安装n个服务,其中服务Ji需要si单位的安装时间,截止时间为di.超时会有惩罚值,若实际完成时间为ci,则惩罚值为max{0,ci-di}.从0时刻开始执行任务,问惩罚值最大 ...
- UVALive - 4108 SKYLINE[线段树]
UVALive - 4108 SKYLINE Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebug ...
- UVALive - 3942 Remember the Word[树状数组]
UVALive - 3942 Remember the Word A potentiometer, or potmeter for short, is an electronic device wit ...
- UVALive - 3942 Remember the Word[Trie DP]
UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...
- 思维 UVALive 3708 Graveyard
题目传送门 /* 题意:本来有n个雕塑,等间距的分布在圆周上,现在多了m个雕塑,问一共要移动多少距离: 思维题:认为一个雕塑不动,视为坐标0,其他点向最近的点移动,四舍五入判断,比例最后乘会10000 ...
- UVALive 6145 Version Controlled IDE(可持久化treap、rope)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- UVALive 6508 Permutation Graphs
Permutation Graphs Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- UVALive 6500 Boxes
Boxes Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Pract ...
- UVALive 6948 Jokewithpermutation dfs
题目链接:UVALive 6948 Jokewithpermutation 题意:给一串数字序列,没有空格,拆成从1到N的连续数列. dfs. 可以计算出N的值,也可以直接检验当前数组是否合法. # ...
随机推荐
- LINQ学习系列-----1.3 扩展方法
这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性. 一.扩展方法介绍 废话不多说,先上源码截图: 上图中Ge ...
- Winform 中 dataGridView 导出到Excel中的方法总结
最近,在做CS端数据导出到Excel中时网上找了很多代码感觉都不是自己想要的,通过自己的整理归纳得到一个比较通用的方法,就给大家分享一下: 该方法需要用到两个参数(即对象),一个 DataGridV ...
- redis配置文件之复制
主从复制使用slaveof将Redis实例作为另一个Redis服务器的副本. 1) Redis复制是异步的,master可以配置成如果它连接的slave没有达到给定的数量,就停止接受写入.2) 如果断 ...
- Imageloader框架
package adapter;import android.content.Context;import android.graphics.Bitmap;import android.graphic ...
- sql server 2008 r2 登陆时显示无法打开默认的数据库
解决! 第一步: 远程其他服务器的数据库能连上,本地的数据库某个用户名就是打不开,一开始以为是用户名或者密码错误, 后来用sqlcmd dos命令 -S . -U an -P sa 的方式登陆时可以的 ...
- PHP 算法
1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. ? 1 2 3 4 5 6 <?php for($i=0 ...
- NodeJS爬虫入门
1. 写在前面 往常都是利用 Python/.NET 语言实现爬虫,然现在作为一名前端开发人员,自然需要熟练 NodeJS.下面利用 NodeJS 语言实现一个糗事百科的爬虫.另外,本文使用的部分代码 ...
- Lucene.net(4.8.0)+PanGu分词器问题记录一:分词器Analyzer的构造和内部成员ReuseStategy
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- C#判断ListBox是否显示了水平滚动条/横向滚动条
参看: Windows消息定义网址:http://wenku.baidu.com/link?url=9fesYjbLSDx9_TsLgSZSVoR7ELal-60x2p-lua_iPR44Xfekz0 ...
- onload和ready的区别
onload和ready的区别 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行 $(document).read()是DOM结构绘制完毕后就执行,不必等到加 ...