1 条题解
-
0
方法思路
- 题目要求我们模拟修改方案的过程,并找出最终使用的方案版本
- 每次修改时,将区间[l,r]内的所有人的愤怒值+1
- 如果任何人的愤怒值超过其愤怒阈值,则停止修改,使用上一版方案
- 我们需要高效地处理区间更新操作,可以使用差分数组
- 在每次修改后,检查所有人的愤怒值是否超过阈值
代码实现
Java
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] line = br.readLine().split(" "); int n = Integer.parseInt(line[0]); int m = Integer.parseInt(line[1]); int[] threshold = new int[n + 1]; // 愤怒阈值 line = br.readLine().split(" "); for (int i = 1; i <= n; i++) { threshold[i] = Integer.parseInt(line[i - 1]); } int[] anger = new int[n + 1]; // 当前愤怒值 for (int i = 1; i <= m; i++) { line = br.readLine().split(" "); int l = Integer.parseInt(line[0]); int r = Integer.parseInt(line[1]); // 区间[l,r]的愤怒值+1 for (int j = l; j <= r; j++) { anger[j]++; // 检查是否有人愤怒值超过阈值 if (anger[j] > threshold[j]) { // 如果有,使用上一版方案 System.out.println(i - 1); return; } } } // 如果所有修改都完成了,使用最后一版方案 System.out.println(m); } }
C++
#include <iostream> #include <vector> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> threshold(n + 1); // 愤怒阈值 for (int i = 1; i <= n; i++) { cin >> threshold[i]; } vector<int> anger(n + 1, 0); // 当前愤怒值 for (int i = 1; i <= m; i++) { int l, r; cin >> l >> r; // 区间[l,r]的愤怒值+1 for (int j = l; j <= r; j++) { anger[j]++; // 检查是否有人愤怒值超过阈值 if (anger[j] > threshold[j]) { // 如果有,使用上一版方案 cout << (i - 1) << endl; return 0; } } } // 如果所有修改都完成了,使用最后一版方案 cout << m << endl; return 0; }
- 1
信息
- ID
- 84
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者