Educational Codeforces Round 82 (Rated for Div. 2)ABC

A

直接暴力找两个一之间的间距

#include
using namespace std;
typedef long long ll;
const int N = 1e5 + 100;
const int M = 4e5 + 100;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
int main()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    int T;
    cin >> T;
    string s;
    vector v;
    while(T --){
        cin >> s;
        v.clear();
        int sum = 0;
        for(int i = 0; i < s.size();i ++){
            if(s[i] == '1') v.push_back(i);
        }
        for(int i = 1;i < v.size();i ++){
            sum += v[i] - v[i-1] - 1;
        }
        cout << sum <

B

需要注意的点:题是让求全部天数,即使你修的好路达到了  但是前面掺杂的坏路不够,也要加上剩下的路的天数

思路较为简单:求g+d所需的最少轮次  然后讨论即可

#include
using namespace std;
typedef long long ll;
const int N = 1e5 + 100;
const int M = 4e5 + 100;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    while(T --){
        ll n,g,b;
        cin >> n >> g >> b;
        if(n <= g){
            cout << n;
        }else{
            ll s = 0, tmp_b = 0;
 
            //高质量天数
            ll aim = n%2==0?n/2:(n/2+1);
 
            //轮次计算
            ll aim_t = aim%g==0?aim/g:(aim/g+1);
 
            s += (aim_t - 1) * (g + b);
 
            tmp_b = (aim_t - 1) * b;
 
            s += aim%g==0?g:(aim%g);
 
            if(tmp_b < (n - aim)) s += n - aim - tmp_b;
 
            cout << s;
        }
        cout << '\n';
    }
    return 0;
}
/*
5 2 1
*/

C

 vis[] :标记字母是否出现
ans[] :记录相邻情况
p:指向位置
初始ans[]中间放上字符串的第一个字符,标记vis=1,p指向当前位置,然后for遍历,左右放就可以了。
放的时候对于当前要放的字符str[i],有两种情况:

1:之前出现过,那么看ans[p]左右,如果ans[p-1]==str[i]||ans[p+1]==str[i],对应的
k左移或者右移。如果没满足相等条件,直接输出NO。
2:之前没出现过,看ans[p]左右,哪个空,放哪儿,k对应的移动,并且vis[str[i]]==1。如果左右都不为空那么直接输出NO,因为
一个字母和三个字母相邻是不能实现键盘的。
结尾,输出ans[]里的字符,再根据vis标记的来输出26个字母中没出现过的字符。

#include
using namespace std;
typedef long long ll;
const int N = 1e5 + 100;
const int M = 4e5 + 100;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
int main()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    char str[210],ans[210];
    int vis[30],T;
    cin >> T;
    while(T --){
        memset(vis,0,sizeof(vis));
        memset(ans,0,sizeof(ans));
        cin >> str;
        int flag = 0, p = 30;
        ans[p] = str[0];
        vis[str[0]-'a'] = 1;
        for(int i = 1;i < strlen(str);i ++){
            if(vis[str[i]-'a']){
                if(ans[p-1] == str[i]) p --;
                else if(ans[p+1] == str[i]) p ++;
                else{
                    flag = 1;
                    break;
                }
            }else{
                if(!ans[p-1]) p --;
                else if(!ans[p+1]) p ++;
                else{
                    flag = 1;
                    break;
                }
                ans[p] = str[i];
                vis[str[i]-'a'] = 1;
            }
        }
        //output answer
        if(flag) cout << "NO";
        else{
            cout <<"YES" << '\n';
            for(int i = 0;i <= 100;i ++){
                if(ans[i] >= 'a' && ans[i] <= 'z') cout << ans[i];
            }
            for(int i = 0;i < 26;i ++) if(!vis[i]) cout << char(i+'a');
        }
        cout << '\n';
    }
    return 0;
}

 

你可能感兴趣的:(codeforces)