P7083 [NWRRC2013] Energy Tycoon

· · 题解

题意

有一行 n 个空位。 有一些能源装置,每个能源装置会占用 12 个空位,并且每回合产生一个单位的能量。每个回合可以建造一个新的能源装置(也可以不建造)。如果没有地方建新的能源装置,可以拆除一些旧的能源装置。每一回合过后,统计这一回合内所有已经建造的能源装置产生的能量,并将其加到总分中。 现在求可能的最大得分。

贪心

因为每一种能源装置产出能量相等,所以在贪心算法中的条件判断式有三个:

  1. 尽可能地放置占位为 1 的装置。
  2. 若剩余位数为 0 且有一个或以上的占位为 2 的装置,则将一个占位为 2 的装置拆除,并更换为占位为 1 的装置。
  3. 若条件 1,2 都不成立,且剩余位数大于等于 2,则放置占位为 2 的装置。

用变量 one,two 分别记录占位为 1,2 的装置数,ans 记录总得分,s 记录每回合安装的装置的占位(s_i 访问每一位进行判断,因为题中未给出回合总数)。

对于贪心的条件 $2$ ,我们让条件表达式为:`n==0&&two>=1`,因为若 $n=1$,则还能安装,若 $two \ge 1$ 则可以拆除一个,安装为占位为 $1$ 的装置(在此处会增加 $2$ 个空位,再减少 $1$ 个空位,总空位数会增加 $1$)。 #### ~~毒瘤~~ + 在这个题目里,数据还是挺毒瘤的,~~不开 `long long` 见祖宗。~~ + 因为题中未给出回合总数,要用 `string` 类存储。 ```cpp #include<bits/stdc++.h> using namespace std; long long n,ans,one,two; string s; int main(){ cin>>n>>s; for(long long i=0;i<s.size();i++){ if(s[i]=='1'){ if(n>=1){ one++; n--; } else if(n==0&&two>=1){ two--; one++; n++; } } else if(s[i]=='2'){ if(n>=2){ two++; n-=2; } } ans=ans+one+two; } cout<<ans; return 0; } ```