洛谷【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; }

浙公网安备 33010602011771号