试题描述 |
冬奥会在紧张的筹备过程当中,根据计划某个比赛日共有2*n条线路需要提供观众的转场服务,上午和下午各n条线路,安排n个司机为当天的观众进行服务,使得上、下午的每条线路都恰好分配到一个司机。 组委会需要按照司机的行驶距离付费,在距离不超过r时只需要支付基本费用,当距离超过r,按照每单位距离s元付费。 |
输入 |
输入文件包含多组测试数据。每组数据的第一行包含3个整数n,r,s;第二行包含n个整数,即上午各条线路的的行驶距离;第三行包含n个整数,即下午各条线路的形式距离。行驶距离不超均为不超过10 000的正整数。当n,r,s都为0时输入结束。 |
输出 |
对于每组数据,输出支付给每个司机基本费用之外的最小费用。 |
输入示例 |
2 100 5 |
输出示例 |
0 |
其他说明 |
【数据规模与约定】 |
思路 :
区赛原题,一个贪心直接搞定,题意和测试数据比较坑 容易理解错。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
int n,r,s,sum=0,x,mor[1001],aft[1001];//mor数组为早上的行驶距离,aft为晚上的。
while(1)//使用while(1)输入(多组数据)
{
sum=0;//每次sum置成0
scanf("%d%d%d",&n,&r,&s);
if(n==0&&r==0&&s==0)
{
break;//结束输入
}
for(int i=0;i<n;i++)
{
scanf("%d",&mor[i]);//输入
}
for(int i=0;i<n;i++)
{
scanf("%d",&aft[i]);//输入
}
sort(mor,mor+n);
sort(aft,aft+n);//排序
long long ans=0;//开long long
for(int i=0;i<n;i++)
{
int p=mor[i]+aft[n-i-1];//贪心 用早上最小加上下午最大 依此类推
ans+=p>r?(p-r)*s:0;//处理答案 超过和没超过两种情况
}
cout<<ans<<endl;//输出
}
}