QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#693658 | #7880. Streak Manipulation | cbbdhz | WA | 1ms | 5688kb | C++20 | 2.0kb | 2024-10-31 16:31:48 | 2024-10-31 16:31:57 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N = 200001;
char v[N];
int sum[N];
int dp[N][6][2];//以i位置结尾,前面维护j个长度至少为k的最小花费
int n, m, k;
void init(int n)
{
for (int i = 0; i <= n; i++)for (int j = 1; j <= 5; j++)
{
dp[i][j][0]=dp[i][j][1] = 1e9;
}
}
bool check(int mid)
{
init(n);
// mid = 1;
for (int i = 1; i <= n; i++)for (int j = 1; j <= k; j++)
{
if (v[i] == '1')
{
dp[i][j][1] = min(dp[i - 1][j][1],dp[i-1][j][0]);
if ((i == n || v[i + 1] == '0') && i - mid >= 0)
{
dp[i][j][1] = min(dp[i][j][1], dp[i - mid][j - 1][0] + (sum[i] - sum[i - mid]));
}
}
else
{
dp[i][j][0] = min(dp[i - 1][j][0],dp[i-1][j][1]);
if (v[i + 1] == '1')continue;//下个位置是1
if (i - mid >= 0)
{
//cout << dp[i - mid][j - 1][0] + sum[i] - sum[i - mid] << endl;
dp[i][j][1] = min(dp[i][j][1], dp[i - mid][j - 1][0] + sum[i] - sum[i - mid]);
}
}
//cout << "以" << i << "位置1结尾前面有" << j << "段长度大于等于" << mid << "的最小花费" << dp[i][j][1] << endl;
//cout << "以" << i << "位置0结尾前面有" << j << "段长度大于等于" << mid << "的最小花费" << dp[i][j][0] << endl;
}
return dp[n][k][0] <= m||dp[n][k][1]<=m;
}
signed main()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
{
cin >> v[i];
}
for (int i = 1; i <= n; i++)
{
sum[i] = sum[i - 1];
if (v[i] == '0')sum[i]++;
}
int ans = -1;
int l = 1; int r = n;
while (l <= r)
{
int mid = (l + r) / 2;
if (check(mid))
{
ans = mid;
l = mid + 1;
}
else
{
r = mid - 1;
}
}
cout << ans << endl;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 5688kb
input:
8 3 2 10110110
output:
3
result:
ok 1 number(s): "3"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3512kb
input:
12 3 3 100100010011
output:
2
result:
ok 1 number(s): "2"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3724kb
input:
4 4 4 0000
output:
-1
result:
ok 1 number(s): "-1"
Test #4:
score: -100
Wrong Answer
time: 1ms
memory: 3748kb
input:
1000 200 5 0001001000101001110010011001101010110101101100010100111110111111010010001100100111100101011100011101011001110010111100100100011001010011000100011111010110100001101110101001110000001000111010000111110100111101100110011010011111000111101001010011000111010111010100101111100000100001011001010...
output:
98
result:
wrong answer 1st numbers differ - expected: '99', found: '98'