[ICPC2016 WF] Swap Space 的题解
题目大意
给你
思路
首先所有的硬盘一共与三种分类:
因为第
应该优先处理第
对于第
假设有
块硬盘分别是 和 。
如果
:先处理 再处理 ,需要的代价是 ;先处理 再处理 ,需要的代价是 。因为 ,所以先处理第 块更优。
如果
:先处理 再处理 ,需要的代价是 ;先处理 再处理 ,需要的代价是 。因为 ,所以先处理第 块更优。
对于第
假设有
块硬盘分别是 和 。
如果
:先处理 再处理 ,需要的代价是 ;先处理 再处理 ,需要的代价是 。因为 ,所以先处理第 块更优。
如果
:先处理 再处理 ,需要的代价是 ;先处理 再处理 ,需要的代价是 。因为 ,所以先处理第 块更优。
所以,排序之后模拟整个过程,时间复杂度
AC Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,c1,c2,ans,cnt;
struct node{int a,b;}s1[N],s2[N];
bool cmp1(node x,node y){return x.a<y.a;}
bool cmp2(node x,node y){return x.b>y.b;}
signed main(){
cin>>n;
for(int i=1,a,b;i<=n;i++){
cin>>a>>b;
if(a<b) s1[++c1]={a,b};
else s2[++c2]={a,b};
}sort(s1+1,s1+1+c1,cmp1),sort(s2+1,s2+1+c2,cmp2);
for(int i=1;i<=c1;i++){
if(cnt<s1[i].a) ans+=(s1[i].a-cnt),cnt=0;
else cnt-=s1[i].a;
cnt+=s1[i].b;
}for(int i=1;i<=c2;i++){
if(cnt<s2[i].a) ans+=(s2[i].a-cnt),cnt=0;
else cnt-=s2[i].a;
cnt+=s2[i].b;
}cout<<ans<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】