Polynomial Round 2022 (Div. 1 + Div. 2, Rated, Prizes!)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值