题意及思路
- 题意:h次请求,每次请求在b到e这段路上种t颗数,在满足所有的请求后,循环最少需要种多少颗数。
- 思路:贪心做法。😂第一步,将得到的请求数组排序(按e,结尾位置从大到小排序)。🙄第二步,对于每一次
请求,😉从请求头到请求尾逐次访问数组q(q是一个存储当前路段是否种树的标记数组,比如q[x]表示路段x是否种过树),如果已经种树(q[x] = 1),则当前请求已种树个数tree++;😊若一次遍历后,tree不满足其请求树数目,则从尾到头逆序种树(置q[x] = 1),🤗同时tree++、ans++。😏详情见代码。
思维图
代码
#include<bits/stdc++.h>
using namespace std;
const int M = 5005,N = 3e4+5;
int q[N] = {0};
struct T{
int b,e,t;
}querry[M];
bool cmp(T t1,T t2){
return t1.e < t2.e;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
int n,h;
cin >> n >> h;
for(int i=1;i<=h;i++){
cin >> querry[i].b >> querry[i].e >>querry[i].t;
}
sort(querry+1,querry+1+h,cmp);
int ans = 0;
for(int i=1;i<=h;i++){
int tree = 0;
for(int j=querry[i].b;j<=querry[i].e;j++){
if(q[j]==1) tree++;
}
if(tree<querry[i].t){
for(int j=querry[i].e;j>=querry[i].b;j--){
if(tree==querry[i].t) break;
if(q[j]==0){
tree++;
ans++;
q[j] = 1;
}
}
}
}
cout << ans << endl;
return 0;
}

京公网安备 11010502036488号