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∗

784





