noip模拟赛 幻灯结界
题目描述
59式给你出了一道**题:
有n个防御人(守方)还有n个攻击坦克(攻方)
每个防御人有护甲a[i],而攻击方每个坦克有火力b[i]
如果一个防守方的护甲不小于攻击方的攻击力,就可以防的住
然而我们保持了最大限度的克制,所以每个攻击方的攻击力都减去了t
而且防守方有zcy所以你有x次机会加强一个人的护甲,把它的护甲变成y
求安排一个防御的方案,一个人正好对一个坦克,使得t尽可能的小,并且满足没有人被坦克打败。
然而由于zcy吊打集训队,所以不要求你输出方案,只要求输出最小的可能的t
这个t是根据你的人和坦克的配对方案而变化的,不是人为给出的
可以认为你给出了一个方案后,某某某才确定出了这个t值,而你要让某某某确定出的这个t值最小
也就是说这个题求的就是那个最小的t
输入输出格式
输入格式:
第一行三个数n,x,y
之后一行n个数表示每个守方的护甲
之后一行n个数表示每个攻击坦克的火力
输出格式:
一行一个数表示答案
输入输出样例
说明
样例#3,#4,#5,#6见下发的文件
【子任务】
子任务会给出部分测试数据的特点。
如果你在解决题目中遇到了困难, 可以尝试只解决一部分测试数据。
每个测试点的数据规模及特点如下表:
测试点编号 n的范围 x的范围 y的范围
输入样例#1:
2 0 0
6 4
8 9
输出样例#1:
4
输入样例#2:
8 6 4
1 9 2 6 0 8 1 7
6 4 6 4 8 9 8 9
输出样例#2:
2
测试点编号 n的范围 x的范围 y的范围
测试点1 n = 10 x = 0 无限制
测试点2 n = 10 x = 0 无限制
测试点3 n = 10 无限制 y = 0
测试点4 n = 10 无限制 y = 0
测试点5 n = 1000 x = 0 无限制
测试点6 n = 1000 x = 0 无限制
测试点7 n = 1000 无限制 y = 2000000000
测试点8 n = 1000 x = n 无限制
测试点9 n = 100000 无限制 无限制
测试点10 n = 200000 无限制 无限制
对于100%的数据,n <= 200000 , 0<=ai,bi,x,y<=2000000000
【说明】
【样例1说明】
当克制值t为4的时候
用守卫4挡坦克8,守卫6挡坦克9
可以挡住
【样例2说明】
当克制值t为2的时候
把守卫0,1,1,2都变成4
之后按如下顺序排列守方和攻击方
9 4 6 4 4 8 7 4
9 6 8 4 6 9 8 4
分析:比较水的一道题,这x次肯定是用的越多越好,把最小的x个提出来,看看能不能用y替代,每个值肯定都要比y小,把修改后的数组排个序,坦克也排个序,从小到大一一匹配就好。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 200010; int n, x, y, a[maxn], b[maxn], ans; int main() { scanf("%d%d%d", &n, &x, &y); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) scanf("%d", &b[i]); sort(a + 1, a + 1 + n); sort(b + 1, b + 1 + n); for (int i = 1; i <= x; i++) a[i] = max(a[i], y); sort(a + 1, a + 1 + n); for (int i = 1; i <= n; i++) ans = max(ans, b[i] - a[i]); printf("%d\n", ans); return 0; }