学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
美术馆有n幅画,在画廊里从西向东排成一列,这些画从西向东编号为1~n。第i幅画在局里最西端 x i x_i xi米位置,它的价值为 v i v_i vi。
明天要召开展览会,来客会非常多,馆长决定只展出其中m幅画,其他画都拿走放到库房里。如果留下的画距离太近,观众们观赏起来会不方便。所以留下的画之间的距离必须大于等于D。
展览会的“华丽度”定义为展出的m幅画中,价值最低的画的价值。通过适当选择留下的m幅画,能得到最大的“华丽度”是多少。
【输入】
第1行,3个正整数n,m,D。
接下来n行,每行两个整数 x i , v i x_i,v_i xi,vi
【输出】
输出可以得到的最大“华丽度”。如果无法选出满足要求的画,输出-1。
【输入样例】
3 2 20
10 250
30 200
50 500
【输出样例】
250
【代码详解】
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+5;
struct paint {
int x, v;
}p[N];
bool cmp(paint a, paint b)
{
return a.x < b.x;
}
int n, m, d;
bool check(int mid)
{
int s = 0, last = -1e9;
for (int i=1; i<=n; i++)
if (p[i].v>=mid && p[i].x-last>=d) {
s++;
last = p[i].x;
}
return s>=m;
}
int main()
{
scanf("%d%d%d", &n, &m, &d);
int l = 0, r = 0, ans=0;
for (int i=1; i<=n; i++) {
scanf("%d%d", &p[i].x, &p[i].v);
r = max(r, p[i].v);
}
sort(p+1, p+n+1, cmp);
while (l<=r) {
LL mid = (l+r)/2;
if (check(mid)) {
ans = mid;
l = mid+1;
}
else r = mid-1;
}
if (ans==0) printf("%d\n", -1);
else printf("%d\n", ans);
return 0;
}
【运行结果】
3 2 20
10 250
30 200
50 500
250