A. Question Marks
给你一串答案字符串,ABCD分别有n个不会的空着标记为"?",问你最多能对几个,显然假设全对就行,不过每个答案最多n个,取min就行。
int cnt[4];
void solve(){
memset(cnt,0,sizeof(cnt));
int n;
cin>>n;
string a;
cin>>a;
int ans = 0;
for(int i = 0;i<4*n;i++) if(a[i]!='?') cnt[a[i]-'A']++;
for(int i = 0;i<=3;i++) ans+=min(cnt[i],n);
cout<<ans<<endl;
}
B. Parity and Sum
给你一些数字,进行操作把他们就行相同,操作 : 选一个奇数一个偶数,他们之和为K,谁数值最小就用k替代他,所以显然,最后的序列只能是奇数,那么有问题,是直接把最大的偶数加上最大的奇数就行了还是有其他的方法,显然,只要比最大的奇数小的偶数之和加上这个奇数的值比最大的偶数大就不必用最大的偶数加上最大的奇数
const int N = 2e5+10;
int a[N];
void solve(){
int n;
cin>>n;
vector<int> ou;
vector<int> ji;
for(int i = 1;i<=n;i++){
int x;
cin>>x;
if(x%2==0){
ou.push_back(x);
}else{
ji.push_back(x);
}
}
int cntji = ji.size();
int cntou = ou.size();
if(cntji==0||cntou==0){
cout<<"0"<<endl;
return ;
}
sort(ji.begin(),ji.end());
sort(ou.begin(),ou.end());
if(ji[cntji-1]>ou[cntou-1]){
cout<<cntou<<endl;
return ;
}
if(ji[cntji-1]<ou[0]){
cout<<cntou+1<<endl;
return ;
}
long long res = ji[cntji-1];
for(auto x : ou){
if(res>x){
res+=x;
}else{
cout<<cntou+1<<endl;
return ;
}
}
cout<<cntou<<endl;
return ;
}
C. Light Switches
首先关注到周期性,单拎出来每个灯的状态都是周期性的,又注意到只有最终安装上芯片的灯安装完芯片才能做到全亮,所以记录一下这个值,因为同时亮起来的时间最长的区间长度为k,所以可以维护一个长度为k的区间,来记录整个亮灯区间的亮灯容错,在遍历一边数组,更新区间,最终的答案就是最晚的安装芯片值加上维护区间的左边界代码如下
/*
*
* █████▒█ ██ ▄████▄ ██ ▄█▀ ██████╗ ██╗ ██╗ ██████╗
* ▓██ ▒ ██ ▓██▒▒██▀ ▀█ ██▄█▒ ██╔══██╗██║ ██║██╔════╝
* ▒████ ░▓██ ▒██░▒▓█ ▄ ▓███▄░ ██████╔╝██║ ██║██║ ███╗
* ░▓█▒ ░▓▓█ ░██░▒▓▓▄ ▄██▒▓██ █▄ ██╔══██╗██║ ██║██║ ██║
* ░▒█░ ▒▒█████▓ ▒ ▓███▀ ░▒██▒ █▄ ██████╔╝╚██████╔╝╚██████╔╝
* ▒ ░ ░▒▓▒ ▒ ▒ ░ ░▒ ▒ ░▒ ▒▒ ▓▒ ╚═════╝ ╚═════╝ ╚═════╝
* ░ ░░▒░ ░ ░ ░ ▒ ░ ░▒ ▒░
* ░ ░ ░░░ ░ ░ ░ ░ ░░ ░
* ░ ░ ░ ░ ░
*/
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
using ll =long long;
using pii = pair<int,int>;
using tri = tuple<int,int,int>;
void solve(){
int n,k;
cin>>n>>k;
vector<int> a(n+1);
int maxa = 0;
for(int i = 1;i<=n;i++) cin>>a[i];
for(int i = 1;i<=n;i++) maxa = max(maxa,a[i]);
int st = 0;
int ed = k-1;
for(int i = 1;i<=n;i++){
int gap = (maxa-a[i])%(2*k);
if(k==gap){
cout<<"-1"<<endl;
return ;
}
if(gap<k){
ed = min(ed, k-gap-1);
}
if(gap>k){
st = max(st,2*k-gap);
}
}
if(st>ed) cout<<"-1"<<endl;
else cout<<maxa+st<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int Test_number = 1;
cin>>Test_number;
while(Test_number--) solve();
return 0;
}
D. Med-imize
在想了