A. Add Plus Minus Sign
题意:
思路:
当 s[i-1] == '1' 时,输出 '-'; 当 s[i-1] == '0' 时,输出 '+';
当前表达式的和 sum <= 1
当 s[i-1] == '1'时,无论s[i] == '0' || s[i] == '1',sum 均是变小或不变的
当 s[i-1] == '0' 时,无论s[i] == '0' || s[i] == '1' ,sum肯定为0,此时输出 "+",sum -> 0 | 1
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n; cin >> n;
string s; cin >> s;
bool flag = s[0] == '1';
for( int i = 1 ; i < n ; i++ )
{
if( flag ) cout << '-';
else cout << '+';
if( s[i] == '1' ) flag = !flag;
}
cout << endl;
}
signed main()
{
int tt; cin >> tt;
while(tt--)solve();
return 0;
}
B. Coloring
题意:
思路:(鸽巢原理)
一种颜色的格子最多只能有 ( n + k - 1 ) / k个
但是样例 n = 13 m = 5 k = 3 a[i] = { 5 , 5 , 1 , 1 , 1 }
这个是不符合题意的 1 4 7 10 13 2 5 8 11 14(14是错误的)
取一个最后一个区间大小为 n % k == 0 ? k : n % k
cnt ( a[i] 中等于 ( n + k - 1 ) / k 的个数 ) > 区间大小 -> 输出"NO"
否则 输出 "YES"
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n, m, k;
cin >> n >> m >> k;
vector<int> a(m + 1);
for (int i = 1; i <= m; i++) cin >> a[i];
int temp = (n + k - 1) / k;
int cnt = 0;
for (int i = 1; i <= m; i++)
{
if (a[i] > temp)
{
cout << "NO" << endl;
return ;
}
else if (a[i] == temp) cnt++;
}
if (cnt > (n % k == 0 ? k : n % k) ) puts("NO");
else puts("YES");
}
signed main()
{
int tt; cin >> tt;
while (tt--)solve();
return 0;
}
C. Ice and Fire
题意:
思路:
结论题:(i + 1) - 后缀中连续 0 的个数 或 1 的个数最大值
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n; cin >> n;
string s; cin >> s;
int cnt0 = 0 , cnt1 = 0;
s = " " + s;
for( int i = 1 ; i < n ; i++)
{
if( s[i] == '1' )
{
cnt0 = 0 ; cnt1++;
}
else
{
cnt0++ ; cnt1 = 0;
}
cout << i + 1 - max( cnt0 , cnt1 ) << " ";
}
cout << endl;
}
signed main()
{
int tt; cin >> tt;
while(tt--)solve();
return 0;
}