A.
題意:需要向左走a步,向右走b步,向下走c步,向上走d步,同個格子可以走重複過,並且給出啓示位置(x,y),需要保證x1<=x<x2,y1<=y<=y2
我看了別人的題解,A題大串的代碼實在看不下去,就寫了這份簡單短點的。
題解:考慮到同個格子可以走重複過,所以就是可以來回走,只想算出最終x的值變換-a+b,y的值變化-c+d
重點:還需要加上特判邊界剛好是x=x1=x2或y=y1=y2的情況,因爲此時點動彈不得,一動就越界了
如下是AC代碼
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
ll a,b,c,d;
cin>>a>>b>>c>>d;
ll x,y,x1,y1,x2,y2;
cin>>x>>y>>x1>>y1>>x2>>y2;
if((x==x1&&x==x2&&a>0||x==x1&&x==x2&&b>0)||(y==y1&&y==y2&&c>0||y==y1&&y==y2&&d>0))
{
cout<<"No"<<'\n';continue;
}
x=x-a+b;y=y-c+d;
if(x>=x1&&x<=x2&&y>=y1&&y<=y2)cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
}
}
B.
題意:n個數需要染色,而且這n個數中,如果存在gcd(a[i],a[j])!=1,每組的每兩個數都不是互素的,則可以染成不同種顏色,即分組,求需要用多少種染色劑和輸出每個數染色劑的組號
直接不用考慮合數,可以重題目上看到m<=11,a[i]<=1000,數據小,小於1000的最後一個平方是31*31=961,所以可以考慮前m個質數,即可用一個數組int p[12]={0,2,3,5,7,11,13,17,19,23,29,31},把最小的質因數相同的數字分到同一組染色劑即可
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define ll long long
#define _for(i,j,k) for(int i=j;i<k;i++)
#define endl '\n'
#define inf 1<<29-1
const int mod=1e9+7;
const int MAX=1e6+5;
int p[12]={2,3,5,7,11,13,17,19,23,29,31};
int a[32],b[1005];
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n,cnt=0,ans=0;
cin>>n;
set<int>st;
for(int i=0;i<n;i++)
{
cin>>b[i];
for(int j=0;j<11;j++)
{
if(b[i]%p[j]==0)
{
if(st.count(p[j])==0)
{
ans++;
a[p[j]] = ++cnt;
b[i] = a[p[j]];
st.insert(p[j]);
}
else b[i] = a[p[j]];
break;
}
}
}
cout<<ans<<'\n';
for(int i=0;i<n;i++)
cout<<b[i]<<" ";
cout<<'\n';
}
}
C.
題意:輸入一個長爲n的字符串,可以分成n/k段,每段長k,你可以需要改變每段的字符,使得而且每小段相同而且滿足自身迴文,求需要改變最少的次數
暴力預處理+貪心
你可以考慮到字符串是由26個字符組成的,而且有n/k段每一段都與第一段相同,即每段相同字母的位置相同,故可以開一個二維數組a[i][j]記錄每段第i個字符出現的次數。再考慮每段自身的迴文和有n/k段,進行貪心min。
需要注意是題目會卡memset,所以只能手動for初始化;注意k的奇偶性質,判斷是否需要再貪一次;
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define ll long long
#define _for(i,j,k) for(int i=j;i<k;i++)
#define endl '\n'
#define inf 1<<29-1
const int mod=1e9+7;
const int MAX=1e6+5;
ll a[MAX][26];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=0;i<k;i++)
{
for(int j=0;j<26;j++)
{
a[i][j]=0;
}
}
string s;
cin>>s;
for(int i=0;i<k;i++)
{
for(int j=i;j<n;j+=k)
{
a[i][s[j]-'a']++;
}
}
ll ans=0,Max,l=0,r=k-1,d=n/k;
while(l<r)
{
Max=MAX;
for(int j=0;j<26;j++)
{
Max=min(Max,2*d-a[l][j]-a[r][j]);
}
ans+=Max;
l++;r--;
}
if(l==r)
{
Max=MAX;
for(int i = 0; i < 26; i++)
{
Max=min(Max,d-a[l][i]);
}
ans+=Max;
}
cout<<ans<<'\n';
}
}