Codeforces Round #630 (Div. 2) ABC

A - Exercising Walk

题意:

给定向上、下、左、右移动的步数要求d, u, l, r,给定初始位置(x,y),和限定范围(x1,y1), (x2,y2),x1<=x<=x2, y1<=y<=y2。求是否存在某个移动策略,恰等于步数要求,且移动过程中的每一个位置(每次向上/下/左/右移动一步),都在限定范围内。

思路:

终点(x+r-l,y+u-d)必须在范围内,否则NO;

步数要求中,如果向某个方向必须走>=1步,需要考察它能否走出这一步:如果 能向此方向走出1步 或者 能向相反的方向走出1步,则它可以走出这一步,否则NO,这样对四个方向都考察一遍。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int l,r,d,u,x,y,x1,y1,x2,y2;
        cin>>l>>r>>d>>u>>x>>y>>x1>>y1>>x2>>y2;
        bool flag=true;
        if(x-l+r<=x2&&x-l+r>=x1&&y+u-d<=y2&&y+u-d>=y1){
            if(u) if(y+1<=y2||(d&&y-1>=y1)) ; else flag=false;
            if(d) if(y-1>=y1||(u&&y+1<=y2)) ; else flag=false;
            if(l) if(x-1>=x1||(r&&x+1<=x2)) ; else flag=false;
            if(r) if(x+1<=x2||(l&&x-1>=x1)) ; else flag=false;
        }else flag=false;
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}

PS: 比赛的时候A题没做出来,先交了一发 wa了,然后觉得自己读错题了,重新读题浪费好久,然后发现自己第一次读的题意是对的,已经1个半小时过去了,心态完全崩了= = 今天毫无压力,反倒想了一会就AC了。。。

 

C - K-Complete Word

题意:

给定一个长为n的字符串和循环节长度k,问最少替换多少个字母可以得到K-Complete Word。

K-Complete Word def:

1. 首先它是一个回文串 S_i = S_n-i+1

2. for all i from 1 to n-k, S_i = S_i+k

贪心思路:

分析题意可以发现 K-Complete Word是一个 每k个字符都是一个回文串 的串,以前k/2个字母分别为起点,步长为k,每条路径上的字符应该相等,统计 该字符 和 它在区段回文串中对称位置的字符种类(如果对称位置和该字符重合了就不计)。

eg: k=3, abaaba, aba|aba,彩色的四个字符是应该相等的,蓝色表示长为k的区段回文串中与红色对称的位置。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
char s[N];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n,k,ans=0;
        scanf("%d%d%s",&n,&k,s+1);
        for(int i=1;i<=(k+1)/2;++i){
            int mp[26]={0};
            int c=0;
            for(int j=i;j<=n;j+=k){
                ++mp[s[j]-'a'];++c;
                if(j!=j+k+1-i-i) ++mp[s[j+k+1-i-i]-'a'],++c;
            }
            ans+=c-*max_element(mp,mp+26);
        }
        printf("%d\n",ans);

    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值