NOIP2016 模拟题 day2 业务办理
【问题描述】 在银行柜台前,有 n 个顾客排队办理业务。队伍中从前往后,第 i 位顾客办理业务需要 ti 分钟时间。一位顾客的等待时间定义为:队伍中在他之前的所有顾客和他自己的办理业务 时间的总和。第 i 位顾客有一个最长等待时间 di,如果超过了时间 di,业务还没有办理完成, 那么这位顾客就会觉得不满意。具体来说,假设第 i 位顾客的等待时间为 fi,若 fi> di,则这 位顾客的不满意度为 fi-di,否则不满意度为 0。 你作为银行里的职员,需要安排这 n 位顾客的初始排队顺序,使得不满意度最大的那位 顾客不满意度最小。
【输入】 输入的第 1 行包含一个正整数 n,表示顾客的数量。 输入的第 2 行包含 n 个正整数,第 i 个数表示 ti,单位为分钟。 输入的第 3 行包含 n 个正整数,第 i 个数表示 di,单位为分钟。
【输出】 输出包含 1 个整数,表示最大不满意度的最小值。
【输入输出样例 1】
transact.in
3
5 8 10
11 15 13
transact.out
8
【输入输出样例 1 说明】 排队顺序 1 3 2
业务办理时间 5 10 8
等待时间 5 15 23
最长等待时间 11 13 15
不满意度 0 2 8
最大不满意度为 8。
这是最大不满意度能达到的最小值。
【数据规模与约定】
对于 50%的数据,n≤10
对于 70%的数据,n≤1,000
对于 100%的数据,n≤100,000,1≤ti≤104,0≤di≤109
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#define ll long long
using namespace std;
ll n,ans,sum;
struct p{
int t; int d;
};
p a[100020];
ll Aesan(){
ll x=0;char s=getchar();
while(s<'0'||s>'9')s=getchar();
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x;
}
bool cmp(p a, p b){
return a.d<b.d;
}
int main()
{
//freopen("transact.in","r",stdin);
//freopen("transact.out","w",stdout);
n=Aesan();
for(int i = 1;i <= n; i++) a[i].t=Aesan();
for(int i = 1;i <= n; i++) a[i].d=Aesan();
sort(a+1,a+1+n,cmp);
ans=0;
for(int i = 1;i <= n;i++)
{
sum+=a[i].t;
if(sum>a[i].d) ans=max(ans,sum-a[i].d);
}
printf("%lld",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}
浙公网安备 33010602011771号