SP27102 FN16SWAP - Swap Space

SP27102 FN16SWAP - Swap Space

思路

首先可以发现确定了格式化硬盘的顺序我们可以通过线性时间复杂度算出额外硬盘的空间。然后我们考虑贪心策略:当 \(b_i\ge a_i\) 时我们要按照 \(b_i\) 的大小降序排序,因为这样可以尽量减少额外硬盘所需空间;当 \(b_i<a_i\) 时,则需要以 \(a_i\) 升序排序,尽量不要让所需 \(a_i\) 大于当前的 \(ans\)。

ACcode

#include <bits/stdc++.h>
using namespace std;
#pragma G++ optimize(2,3,"Ofast","inline")
#define freop(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
#define int long long
#define double long double
#define re register
#define endl '\n'
#define inf 0x7f7f7f7f7f7f7f7f
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define fir first
#define sec second
#define umap unordered_map
#define uset unordered_set
const int N=1e6+1;
int n,t,a[N],b[N],id[N],ans,sum;

bool cmp(int x,int y){
	int ax=a[x],bx=b[x],cx=b[x]-a[x],ay=a[y],by=b[y],cy=b[y]-a[y];
	return ((cx>=0)^(cy>=0)?cx>cy:(cx>=0?ax<ay:bx>by));
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	freop();
//↑以上为初始化↑
//------------------------------
	while(cin >> n){
      ans=sum=0;
  	  for(int i = 1;i<=n;++i) cin >> a[i] >> b[i],id[i]=i;
  	  sort(id+1,id+n+1,cmp);
  	  for(int i = 1;i<=n;++i)	ans=max(ans,a[id[i]]-sum),sum+=b[id[i]]-a[id[i]];
  	  cout << ans << endl;
  }
	return 0;
}
posted @ 2026-10-21 21:28  elon_giao  阅读(4)  评论(0)    收藏  举报