一.问题描述
二.问题分析及思路
1.每次最左边的青蛙会吃掉右边的蚊子,可以把青蛙按位置从左到右排列,判断蚊子是不是在青蛙的捕获范围内.
2.由于蚊子是在每次所有可能吃完的蚊子都被吃完后才按顺序落下,而不是按照位置依次落下或者同时存在,所以存在这样一种情况.一只更靠右的蚊子先出现了但没有被青蛙捕获,而下一只蚊子可以被吃掉,被吃掉后青蛙可以够到刚才够不到的蚊子了,因此每次吃完后长度范围伸长后要返回判断能不能吃掉之前没有吃掉的蚊子,直接给蚊子加入一个判断是否存活的变量,每次返回开头重新遍历所有蚊子.
三.代码
#include<iostream>
#include<algorithm>
using namespace std;
struct qw {
int pos;
int len;
int eat = 0;
int index;
};
struct wz {
int pos;
int weight;
bool live = 1;
};
bool cmp1(qw a, qw b) { //按位置排列
return a.pos < b.pos;
}
bool cmp2(qw a, qw b) { //最后按顺序输出
return a.index < b.index;
}
int main() {
int n, m;
cin >> n >> m;
qw qws[n];
wz wzs[m];
for (int i = 0; i < n; i++) {
cin >> qws[i].pos >> qws[i].len;
qws[i].index = i;
}
for (int i = 0; i < m; i++) {
cin >> wzs[i].pos >> wzs[i].weight;
}
sort(qws,qws+n,cmp1);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (wzs[i].live && qws[j].pos + qws[j].len >= wzs[i].pos&&qws[j].pos<=wzs[i].pos) {
qws[j].eat++;
qws[j].len += wzs[i].weight;
wzs[i].live = 0;
i=-1;
break;
}
}
}
sort(qws,qws+n,cmp2);
for(int i=0;i<n;i++)
{
cout<<qws[i].eat<<" "<<qws[i].len<<endl;
}
return 1;
}