思路:点击打开链接
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000+10;
struct node{
int s,d;
}ti[maxn];
int n,p;
int cmp(node a,node b)
{
return a.d<b.d;
}
int deal(int x)
{
int sum=0,a=0,b=0;
for(int i=0;i<=p;i++)
{
if(i==x) continue;
sum+=ti[i].s;
int temp=max(sum-ti[i].d,0);
if(temp>a){
b=a;
a=temp;
}
else if(temp>b){
b=temp;
}
}
sum+=ti[x].s;
int temp=max(sum-ti[x].d,0);
if(temp>a){
b=a;
a=temp;
}
else if(temp>b){
b=temp;
}
return a+b;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&ti[i].s,&ti[i].d);
sort(ti,ti+n,cmp);
int sum=0,a=0,b=0;
for(int i=0;i<n;i++)
{
sum+=ti[i].s;
int temp=max(sum-ti[i].d,0);
if(temp>a)
{
b=a;
a=temp;
p=i;
}
else if(temp>b)
{
b=temp;
p=i;
}
}
int ans=a+b;
for(int i=0;i<p;i++)
ans=min(ans,deal(i));
printf("%d\n",ans);
}
return 0;
}