吃瓜群众升级版
原创
©著作权归作者所有:来自51CTO博客作者yitahutu79的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目描述
某地总共有 M 堆瓜,第 i 堆瓜的数量为 Xi。现有 N 组群众现在想要吃瓜,第 i 组群众想要吃的瓜的数量为 Yi。现在对于每组想吃瓜的群众,需要在 M 堆瓜中查找大于等于需要数量的第一堆瓜,并输出那堆瓜的编号,若所有瓜堆的数量均小于需要数量,则输出 0。
输入
输入共 3 行。
第一行两个整数 M,N。
第二行 M 个整数分别表示 X1,X2…XM。(保证各不相同)
第三行 N 个整数分别表示 Y1,Y2…YN。(保证各不相同)
输出
对于每个 Yi 输出一行一个整数为大于等于需要数量的第一堆瓜的编号,若所有瓜堆的数量均小于需要数量,则输出 0。
样例输入
5 5
1 3 26 7 15
27 10 3 4 2
样例输出
0
5
2
4
2
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 1≤M,N≤100,000,1≤Xi,Yi≤1,000,000,000
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct waterm {
int num, cnt;
};
bool cmp(waterm a, waterm b) {
return a.cnt < b.cnt;
}
int main() {
int m, n;
waterm wm[100005];
scanf("%d%d",&m,&n);
for (int i = 0; i < m; i++) {
scanf("%d",&wm[i].cnt);
wm[i].num = i + 1;
}
sort(wm, wm + m, cmp);
for (int i = 0; i < n; i++) {
int temp, l = 0, r = m - 1, f = 0;
scanf("%d",&temp);
if (wm[m - 1].cnt < temp) {
printf("0\n");
continue;
}
while (l != r) {
int mid = (l + r) / 2;
if (temp > wm[mid].cnt) {
l = mid + 1;
}
else {
r = mid;
}
}
printf("%d\n",wm[l].num);
}
return 0;
}