题意:
给定向上、下、左、右移动的步数要求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了。。。
题意:
给定一个长为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;
}