Alatúlië,Heldo!

洛谷【LGR-180-Div.3】洛谷基础赛 #9 & SFOI Round 1 T427015 「SFOI Round 1」Shade题解

题目所在比赛链接

题目描述

  小 F 很喜欢「アイデア」这首歌。

  现在小 F 有一个 N×M 格的方格纸,第(i,j) 个格子上有 Ai,j​ 层的「影子」。

  小 F 想要把「影子」划破,他可以一次清除某一格上所有层的「影子」,但每清除一次就要消耗 11 点「妙意」,每清除 k 层「影子」可以恢复 11 点「妙意」,当小 F 没有「妙意」时,他就不能清除「影子」了。

  小 F 现在有 t 点「妙意」,请你求出他最多可以清除多少层「影子」。

输入格式

  输入共 N+1 行。

  第 11 行 44 个整数,分别表示方格纸的长度 N、宽度 M 以及恢复「妙意」所需清除「影子」的层量 k 和小 F 初始时拥有「妙意」的点数 t。

  第 22 至 N+1 行,每行 M 个整数,分别表示该格子上的「影子」的层数 Ai,j​。

输出格式

  输出共 11 行 11 个整数,表示可以清除「影子」层数的最大值。

分析:

  因为小F要通过消层数大的来回「妙意」,可以理解为要蓝开技能,技能为“多「妙意」”,然后每次技能要花k个蓝,我们可以定义一个now来代表当前的蓝,如果now≥k了,就可以回「妙意」now/k个,我们可以得出

    if(now>=k){
            long long add=now/k;
            now=now%k;
            t=t+add;
        }

 

 

 

  这我们就可以很好理解,要从大到小来消「影子」,这样可以让「妙意」得到充分的使用,作者很懒,所以就用优先队列写的,再加上二维数组太大开不下,所以用map写

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
long long N,M,k,t;
int main (){
    priority_queue<int>que;
    map<int ,map<int,int>>mp;
    cin>>N>>M>>k>>t;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            cin>>mp[i][j];
            que.push(mp[i][j]);
        } 
    }
    long long ans=0,now=0,step=0;
    while(t!=0){
        step++;
        if(step>N*M)break;
        t--;
        ans+=que.top();
        now+=que.top();
        if(now>=k){
            long long add=now/k;
            now=now%k;
            t=t+add;
        }
        que.pop();    
    }cout<<ans;
} 

 

posted @ 2024-03-24 19:11  UKE__3ms  阅读(59)  评论(0)    收藏  举报