題意:
給定向上、下、左、右移動的步數要求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;
}