码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 1296 题解(更新中)

时间:2020-02-06 14:34:22      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:space   class   pair   span   size   back   syn   fir   robot   

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!\n")
#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\n");
        else
            printf("YES\n");
    }
    
    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!\n")
#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\n",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!\n")
#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\n");
        else
            printf("%d %d\n",anst,aned);
    }
    return 0;
}

codeforces 1296 题解(更新中)

标签:space   class   pair   span   size   back   syn   fir   robot   

原文地址:https://www.cnblogs.com/Asurudo/p/12268311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!