codeforces 1296 题解(更新中)

Posted asurudo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 1296 题解(更新中)相关的知识,希望对你有一定的参考价值。

codeforces 1296 题解

A. Array with Odd Sum

想要数组加和为奇数,可以从数组长度是奇数还是偶数着手

  • 若数组长度为偶数,则数组全奇或全偶必定不能构造满足题目要求的数列
  • 若数组长度为奇数,则数组全偶必定不能构造满足题目要求的数列
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define _for(i,a,b) for(int i = (a);i < b;i ++)
#define _rep(i,a,b) for(int i = (a);i > b;i --)
#define INF 0x3f3f3f3f
#define ZHUO 11100000007
#define MOD 1000000007
#define MIKUNUM 39
#define pb push_back
#define debug() printf("Miku Check OK!
")
#define maxn 3503
#define X first
#define Y second


int main()
{
    ios::sync_with_stdio(false);
    
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        //全て odd と even
        int subedeodd = 1,subedeeven = 1;
        
        _for(i,0,n)
        {
            int tmp;
            cin >> tmp;
            if(tmp&0x1)
                subedeeven = 0;
            else
                subedeodd = 0;
        }
        
        if( ((!(n&0x1))&&(subedeeven||subedeodd))
        ||  ((n&0x1) && subedeeven))
            printf("NO
");
        else
            printf("YES
");
    }
    
    return 0;
}

B. Food Buying

原谅我不懂 (cashback) 的含义...但从题目理解去模拟即可,每次得到的钱再加上去然后再滚一遍

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define _for(i,a,b) for(int i = (a);i < b;i ++)
#define _rep(i,a,b) for(int i = (a);i > b;i --)
#define INF 0x3f3f3f3f
#define ZHUO 11100000007
#define MOD 1000000007
#define MIKUNUM 39
#define pb push_back
#define debug() printf("Miku Check OK!
")
#define maxn 3503
#define X first
#define Y second


int main()
{
    ios::sync_with_stdio(false);
    
    int t;
    cin >> t;
    while(t--)
    {
        int x;
        cin >> x;
        int rnt = 0;
        while(x>=10)
        {
            int tmp = x-x%10;
            rnt += tmp;
            x -= tmp;
            x += tmp/10;
        }
        printf("%d
",rnt+x);
    }
    return 0;
}

C. Yet Another Walking Robot

题目说的挺花哨,翻译翻译,把问题转化一下,就是在字符串中找一最小子串使得能够恰好抵消。什么叫恰好抵消?(L) 能和 (R) 抵消,(U) 能和 (D) 抵消,也就是字符串里 (L)(R) 的数量相等, (U)(D) 数量相等即可。

光从字符串角度想不好想,我们考虑一下这个机器人怎么算是能恰好抵消——很显然,如果这个机器人走到了之前走到的位置,也就是它绕了个圈,那就是能够恰好抵消,这个圈就是我们应该删掉的部分。

记录当前位置,存到 (map) 里,(first) 记录到过的坐标,(second) 记录在哪儿到过的,每次到达的位置就去 (map) 里找找,能找到说明有个圈,看看能不能更新答案,然后把这个圈的碰撞点的 (second) 更新为当前位置。

时间复杂度 (O(nlogn))

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define _for(i,a,b) for(int i = (a);i < b;i ++)
#define _rep(i,a,b) for(int i = (a);i > b;i --)
#define INF 0x3f3f3f3f
#define ZHUO 11100000007
#define MOD 1000000007
#define MIKUNUM 39
#define pb push_back
#define debug() printf("Miku Check OK!
")
#define maxn 3503
#define X first
#define Y second
 
 
int main()
{
    ios::sync_with_stdio(false);
 
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        string s;
        cin >> n >> s;
        map<pair<int,int>,int> mp;
        int ans = INF;
        int anst,aned;
 
        int x = 0, y = 0;
        mp[{0,0}] = -1; 
        _for(i,0,s.size())
        {
            if(s[i]=='L')
                x --;
            else if(s[i]=='R')
                x ++;
            else if(s[i]=='U')
                y ++;
            else
                y --;
 
            auto iter = mp.find({x,y});
            if(iter!=mp.end() && ans > i-iter->second)
            {
                ans = i-iter->second;
                anst = iter->second+2;
                aned = i+1;
            }
            mp[{x,y}] = i;
        }
        if(ans==INF)
            printf("-1
");
        else
            printf("%d %d
",anst,aned);
    }
    return 0;
}

以上是关于codeforces 1296 题解(更新中)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 题解合集

Codeforces 1296E2. String Coloring (hard version)

[Codeforces Round #617 (Div. 3)] 题解 A,B,C,D,E1,E2,F

Codeforces 1296F Berland Beauty(思维,图)

bzoj1296: [SCOI2009]粉刷匠(DP)

CF1296B - Food Buying 题解