Codeforces Round #617 (Div. 3)部分题解

比赛链接


A. Array with Odd Sum

题意:给你一个数组。你可以用其中一个数替换另外一个数,你可以无限次使用。求最后是否可以得到奇数数组和。
解题思路:小学奥数…
把所有奇数看作1,所有偶数看作0.

  • 既有奇数也有偶数。可以得到奇数。
  • 只有奇数。奇数个奇数相加为奇数,偶数个奇数相加为偶数。
  • 只有偶数。只能得到偶数。

AC代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
//#pragma GCC optimize(3,"Ofast","inline")
#define LL long long
#define MT(a,b) memset(a,b,sizeof(a))
const int mod=1000007;
const int maxn=1e6;
const int ONF=-0x3f3f3f3f;
const int INF=0x3f3f3f3f;
int num[maxn];
int main (){
    int T;scanf("%d",&T);while (T--){
        int m,tmp,jishu=0,oushu=0;
        scanf("%d",&m);
        for (int i=1;i<=m;i++){
            scanf("%d",&tmp);
            if (tmp&1) jishu=1;
            else oushu=1;
        }
        if (jishu&&oushu) printf("YES\n");
        else{
            if (jishu==0) printf("NO\n");
            if (oushu==0) {
                if (m&1) printf("YES\n");
                else printf("NO\n");
            }
        }
    }
    return 0;
}

B. Food Buying

题意:steam打折啦!每消费10元返1元。问你能最多消费多少元?返利可以继续用作消费。
解题思路:。。

AC代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
//#pragma GCC optimize(3,"Ofast","inline")
#define LL long long
#define MT(a,b) memset(a,b,sizeof(a))
const int mod=1000007;
const int maxn=1e6;
const int ONF=-0x3f3f3f3f;
const int INF=0x3f3f3f3f;
int num[maxn];
int main (){
    int T;scanf("%d",&T);while (T--){
        LL n,ans=0,more=0;
        scanf("%lld",&n);
        ans=n;
        while (n>=10){
            more+=n/10;
            n=n/10+n%10;
        }
        ans+=more;
        printf("%lld\n",ans);
    }
    return 0;
}

C. Yet Another Walking Robot

题意:一个机器人,可以向上下左右(UDLR)四个方向走。给你一串命令,让你从命令中删除最小的字串使机器人最后到达的位置不变。
解题思路:每一次命令,纪录机器人的位置。然后查找机器人最后到这个位置的时间。纪录机器人的位置如果用静态数组会爆掉,所以开动态map就可以了。
map需要排序,所以要重载结构体的运算符。

AC代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
//#pragma GCC optimize(3,"Ofast","inline")
#define LL long long
#define MT(a,b) memset(a,b,sizeof(a))
const int mod=1000007;
const int maxn=1e6;
const int ONF=-0x3f3f3f3f;
const int INF=0x3f3f3f3f;
struct node{
    int x,y;
    bool operator < (const node a) const {
        return x<a.x||(x==a.x&&y<a.y);
    }
    bool operator ==(const node a) const {
        return x==a.x&&y==a.y;
    }
}qwe;
char s;
int len,st,ed;
map<node,int>mp;//走第n次之前的坐标
void solve(int i){
    if (s=='L') qwe.x--;
    if (s=='R') qwe.x++;
    if (s=='U') qwe.y++;
    if (s=='D') qwe.y--;
    int j=mp[qwe];
    if (j>0){
        if (ed-st>i-j) st=j,ed=i;
    }
    mp[qwe]=i;
}
int main (){
    int T;scanf("%d",&T);while (T--){
        scanf("%d",&len);
        mp.clear();
        qwe.x=0,qwe.y=0;
        mp[qwe]=1;
        st=0,ed=len+1;
        getchar();
        for (int i=2;i<=len+1;i++){
            scanf("%c",&s);
            solve(i);
        }
        if (st==0&&ed==len+1)printf("-1\n");
        else printf("%d %d\n",st,ed-1);
    }
    return 0;
}

D. Fight with Monsters

题意:有n个怪兽。你的攻击力为a,对手的攻击力为b。你可以自由选择怪兽。你和对手轮流攻击该怪兽,如果你对怪兽造成最后一击视为你得一分。你有个技能,可以让对手跳过他的回合,可以用k次该技能。问你能获得的最高分是多少。
解题思路:预处理得到每个怪兽如果要得分需要使用的技能次数。然后贪心即可。

AC代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
//#pragma GCC optimize(3,"Ofast","inline")
#define LL long long
#define MT(a,b) memset(a,b,sizeof(a))
const int mod=1000007;
const int maxn=2e5+10;
const int ONF=-0x3f3f3f3f;
const int INF=0x3f3f3f3f;
int num[maxn],w[maxn],dp[maxn];
int main (){
    int n,a,b,k;
    while (~scanf("%d%d%d%d",&n,&a,&b,&k)){
        MT(dp,0);
        for (int i=1;i<=n;i++){
            scanf("%d",&num[i]);
            num[i]=num[i]%(a+b);
            if (num[i]==0) num[i]=a+b;
            if (num[i]<=a) {
                w[i]=0;
                continue;
            }
            num[i]-=a;
            w[i]=num[i]/a;
            if (num[i]%a) w[i]++;
        }
        sort(w+1,w+1+n);
        int ans=0;
        for (int i=1,cost=0;i<=n;i++){
            if (cost+w[i]<=k){
                cost+=w[i];
                ans++;
            } else break;
        }
        printf("%d\n",ans);
//        for (int i=1;i<=n;i++){
//            for (int j=k;j>=w[i];j--){
//                dp[j]=max(dp[j],dp[j-w[i]]+1);
//            }
//        }
//        printf("%d\n",dp[k]);
//我一开始居然想的是dp,属实憨憨。
    }
    return 0;
}

你可能感兴趣的:(Codeforces Round #617 (Div. 3)部分题解)