【牛客周赛 Round 33】C~E题

C题:小红的 01 串 https://ac.nowcoder.com/acm/contest/75630/C
题目描述
小红拿到了一个01 串,她可以进行以下两种操作:

  • 删除第一个字符。
  • 删除第二个字符。操作若干次后 (可以操作 0 次),将得到一个最终的字符串。该字符串每个1’字符将增加 1分,每个’0’字符将减少1 分。小红希望最终的分数尽可能大,你能帮小红求出这个分数吗?

输入描述:
一行字符串,仅由’0’和’1’组成。长度不超过 1 0 5 10^5 105
输出描述:
一个整数,代表最终分数的最大值。
示例1:
输入:

1011011

输出:

4

示例2:
输入:

100010001

输出:

2

示例3:
输入:

00000

输出:

0

分析:
我们发现最终的得分取决于删除字符后字符’1’和’0’的数量,并且是等于max(字符1的数量-字符0的数量),同时我们也可以发现最终删除后的字符,如果有’1’,那么最终的结果的第一个字符一是’1’,不可能为’0’,因为如果是0的话必然会使分数变低,有了这个,我们于是可以找到第个’1’,这样的话不能删第一个字符,只能删第二个字符,那么后面删除的字符必然是连续的,我们便可以维护一个数组,用来存储从该点往后的最大得分值。
下面是完整代码:

// Problem: 小红的 01 串
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/75630/C
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// 

#include<iostream>
#include<queue>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
#include<set>
#include<cmath>
#include<stack>
#include<random>
#include<ctime>
#define ll long long
#define ull unsigned long long 
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define __int128_t int128
using namespace std;
typedef pair<int, int >PII;
const int INF = 0x3f3f3f3f3f3f3f3f;

int main(){
	string s;
	cin >> s;
	int f[10000];
	int a = count(s.begin(),s.end(),'1');
	if(a == 0){
		cout << 0 << endl;
		return 0;
	}	
	int now = s.find('1');//取一个1是保证最终的串开头必然是1,是哪个1无所谓
	int x = 0,y = 0;
	for(int i = s.size()-1;i>=0;i--){
		if(s[i] == '1'){
			x++;
		}else y++;
		f[i] = x-y;
	}
	int ma = -1e8;
	for(int i = now+1;i<s.size();i++){
		ma = max(ma,f[i]);
	}
	cout << 1 + ma << endl;
}


D题:小红的数组清空 https://ac.nowcoder.com/acm/contest/75630/D
题目描述
小红被传送到了一个地下城,地下城有 n n n m m m列的,共 n ∗ m n*m n

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值