2 条题解

  • 0
    @ 2025-3-13 11:21:20

    反悔贪心

    首先这个贪心没有办法一次完成

    那我们不妨按照时间排序

    用一个优先队列来存当前可以不用血量打死的怪物的最小血量,设这个怪物的编号为 jj

    如果当前的时间还允许打当前第 ii 个,那么我们就用 ii 替换掉 jj

    最终输出答案即可

    • -1
      @ 2025-3-13 10:01:27

      题意

      你需要消灭nn个敌人(编号为1n1-n

      对于ii敌人,你如果在t[i]t[i]时刻之前消灭他,你不会耗血,否则你会消耗d[i]d[i]的血量

      问最小需要多少血量

      做法

      反悔贪心

      首先将数组按照t从小到大排序

      然后一次枚举每个数,如果他大于此时时间,就直接扔到小跟堆,否则将他与堆顶比较,ansans加上较小值,然后把那个较大的扔到堆里面

      堆是使得可以免掉的血量最大

      q.size()q.size() 是此时时间

      code

      #include <bits/stdc++.h>
      using namespace std;
      
      const int N = 600;
      
      int n;
      
      struct node {
      	int d, t;
      } arr[N];
      
      void read() {
      	cin >> n;
      	for(int i = 1; i <= n; i++) cin >> arr[i].t;
      	for(int i = 1; i <= n; i++) cin >> arr[i].d;
      	return ;
      }
      
      priority_queue<int,vector<int>,greater<int> > q;
      
      void compute() {
      	sort(arr+1,arr+1+n,[](node a,node b) {
      		return a.t < b.t;
      	});
      	int ans = 0;
      	for(int i = 1; i <= n; i++) {
      		if(q.size() < arr[i].t){
      			q.push(arr[i].d);
      		}
      		else{
      			q.push(arr[i].d);
      			ans += q.top();
      			q.pop();
      		}
      	}
      	cout << ans;
      	return ;
      }
      
      int main() {
      	ios::sync_with_stdio(0);
      	cin.tie(0), cout.tie(0);
      	read();
      	compute();
      	return 0;
      }
      
      
      
      • 1

      信息

      ID
      72
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      (无)
      递交数
      31
      已通过
      12
      上传者