Codeforces Round #617 (Div. 3) ABCD

https://codeforces.com/contest/1296

临时和Juang一起组队打的这场,本来定的分开打另一场,哈哈
题目挺友好的,Juang 70min AK了,我只写了四题,剩下的题目待补

A. Array with Odd Sum

题目大意:

给定n个数字,问我们在这一种操作下:ai变成aj;

能不能让总和为奇数?
input 
5
2
2 3
4
2 2 8 8
3
3 3 3
4
5 5 5 5
4
1 1 1 1
output 
YES
NO
YES
NO
NO
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
LL a[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        LL ji=0,ou=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]%2==1) ji++;
            else ou++;
        }
        if(n%2==1&&ji>=1) cout<<"YES"<<endl;
        else if(n%2==0&&ji>=1&&ou>=1) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

B. Food Buying

题目大意:

给定钱数n,每次我们花m块钱,就可以返回m/10块钱给我们

问我们最多花了多少钱?
input 
6
1
10
19
9876
12345
1000000000
output 
1
11
21
10973
13716
1111111111
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
LL a[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        LL sum=n;
        while(n>=10)
        {
            sum+=n/10;

            n=n/10+n%10;
        }
        cout<<sum<<endl;
    }
    return 0;
}

C. Yet Another Walking Robot

题目大意:

一开始机器人的坐标位于(0,0);每次给定四个方向,让我们在保持最后到达的点不变的基础上,最小化删除字符串的长度。
input 
4
4
LRUD
4
LURD
5
RRUDU
5
LLDDR
output 
1 2
1 4
3 4
-1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        string s;
        cin>>s;
        s="  "+s;
        //cout<<s<<endl;
        map<PII,LL> mp;
        LL x=0,y=0,l=0,r=0,len=1e9;
        mp[{x,y}]=1;
        for(LL i=2;i<s.size();i++)
        {
            if(s[i]=='L')
            {
                if(mp[{x-1,y}])
                {
                    if((i-mp[{x-1,y}]+1)<len)
                    {
                        len=i-mp[{x-1,y}]+1;
                        l=mp[{x-1,y}]+1,r=i;
                    }
                }
                x--;
                mp[{x,y}]=i;
            }
            else if(s[i]=='R')
            {
                if(mp[{x+1,y}])
                {
                    if((i-mp[{x+1,y}]+1)<len)
                    {
                        len=i-mp[{x+1,y}]+1;
                        l=mp[{x+1,y}]+1,r=i;
                    }
                }
                x++;
                mp[{x,y}]=i;
            }
            else if(s[i]=='U')
            {
                if(mp[{x,y+1}])
                {
                    if((i-mp[{x,y+1}]+1)<len)
                    {
                        len=i-mp[{x,y+1}]+1;
                        l=mp[{x,y+1}]+1,r=i;
                    }
                }
                y++;
                mp[{x,y}]=i;
            }
            else if(s[i]=='D')
            {
                if(mp[{x,y-1}])
                {
                    if((i-mp[{x,y-1}]+1)<len)
                    {
                        len=i-mp[{x,y-1}]+1;
                        l=mp[{x,y-1}]+1,r=i;
                    }
                }
                y--;
                mp[{x,y}]=i;
            }
            //cout<<x<<" "<<y<<endl;
        }
        if(l==0&&r==0) cout<<"-1"<<endl;
        else cout<<l-1<<" "<<r-1<<endl;
    }
    return 0;
}

D. Fight with Monsters

题目大意:

给定一个长度为n的数组s,a是我的攻击力,b是对手的攻击力,我有k次魔法;

魔法的功能是可以每次当轮到对手攻击的时候,我可以不让他动,而让我动。(自动抵消一次他的操作)

对于这些怪兽,我们每次都可以自己选择打哪一个,并不是一定要严格按照下标值来进行攻击。

每次的攻击都是我先打,然后对手再打!!

问我们最优的情况下我们可以得到最多是多少分?(每次只要这个怪兽是在我的攻击下血量<=0的,那就意味着我的了一分,对手打死了的和我的得分没有关系)
input 
6 2 3 3
7 10 50 12 1 8
output 
5
input 
1 1 100 99
100
output 
1
input 
7 4 2 1
1 3 5 4 2 7 6
output 
6

读了好久的假题,我跌,不然早开出了,慢的一批

  • 每次自己可以打死的,那就直接计数,如果在我打不死这个怪兽的情况下,就看看我需要多少步能打死这个怪兽?
  • 如果我的k满足步数的话,直接计数,不然就只能让队友打死了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
LL sum[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n,a,b,k;
        cin>>n>>a>>b>>k;
        LL ans=0;
        for(LL i=1;i<=n;i++)
        {
            cin>>sum[i];
            sum[i]%=(a+b);
            if(sum[i]==0) sum[i]=a+b;
        }
        sort(sum+1,sum+1+n);
        /*for(LL i=1;i<=n;i++)
        {
            cout<<sum[i]<<" ";
        }
        cout<<endl;*/
        for(LL i=1;i<=n;i++)
        {
            if(sum[i]<=a) ans++;
            else
            {
                sum[i]-=a;
                LL flag=sum[i]/a;
                if(sum[i]%a!=0) flag++;
                if(k>=flag)
                {
                    k-=flag;
                    ans++;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
posted @ 2022-11-10 20:32  Vijurria  阅读(19)  评论(0编辑  收藏  举报