Codeforces Gym 100269E Energy Tycoon 贪心

Energy Tycoon

题目连接:

http://codeforces.com/gym/100269/attachments

Description

Little Vasya is playing a new computer game — turn-based strategy “Energy Tycoon”.
The rules of the game are quite simple:
• The board contains n slots arranged in a line.
• There are power plants, one power plant occupies one or two consecutive slots, and produces one
unit of energy.
• Each turn the game allows you to build one new power plant, you can put it on the board if you
wish. If there is no place for the new power plant, you can remove some older power plants.
• After each turn, the computer counts the amount of energy produced by the power plants on the
board and adds it to the total score.
2
2
1
2 1
1
1 1
2
1 1
1
1 1 1
Vasya already knows the types of power plant he will be able to build each turn. Now he wants to know,
what the maximum possible score he can get is. Can you help him?

Input

The first line of the input contains one integer n (1 ≤ n ≤ 100 000) — the number of slots on the board.
The second line contains the string s. The i-th character of the string is 1 if you can build one-slot power
plant at the i-th turn and the character is 2 if you can build two-slot power plant at the i-th turn. The
number of turns does not exceed 100 000.

Output

The output should contain a single integer — the maximal score that can be achieved

Sample Input

3
21121

Sample Output

10

Hint

题意

有长度为n个格子,你有两种操作,1是放一个长度为1的东西上去,2是放一个长度为2的东西上去

每个东西在每秒钟都会产生1的能力。

然后问你怎么放才能使得最后能力最大,输出出来

题解:

贪心,最后肯定1越多越好

所以我们放1的时候,注意一下,如果放不下的话,就把其中一个2扔掉,然后放1就好了

代码

#include<bits/stdc++.h>
using namespace std;

string s;
int main()
{
    freopen("energy.in","r",stdin);
    freopen("energy.out","w",stdout);
    int n;
    cin>>n;
    cin>>s;
    long long ans = 0,a1 = 0,a2 = 0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='1')
        {
            if(a1+a2*2+1<=n)
                a1++;
            else if(a2)
            {
                a2--;
                a1++;
            }
        }
        if(s[i]=='2')
        {
            if(a1+a2*2+2<=n)
                a2++;
        }
        ans+=(a1+a2);
    }
    cout<<ans<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值