A. 最大值最小 我们只需要维护一个231 即可
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define ll long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6,M=1e6+10;
const int maxn=2e4+10;
int dp[maxn],ansl[maxn],ansid[maxn],nx[maxn];
char t[maxn],s[11][maxn];
int ans[110];
void solve(){
int n;cin>>n;
n-=6;
int a=2,b=3,c=1;
int k=n/3;
a+=k;b+=k;c+=k;
int r=n%3;
if(r==1)b++;
else if(r==2)a++,b++;
cout<<a<<" "<<b<<" "<<c<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
B. 找到差的最大值 如果有不满足的情况就是No
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=1e6+10;
const int maxn=5e4+10;
void solve(){
int n;cin>>n;int a[n+1],b[n+1];int maxx=-INF;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i],maxx=max(maxx,a[i]-b[i]);
if(maxx<0){
cout<<"NO"<<'\n';return ;
}
for(int i=1;i<=n;i++){
a[i]-=maxx;
if(a[i]<0)a[i]=0;
if(a[i]!=b[i]){
cout<<"NO"<<'\n';
return ;
}
}
cout<<"YES"<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
C. 队列 就是队列 每次记录一下上一个结束的时间和下一个开始的时间即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=1e6+10;
const int maxn=5e4+10;
void solve(){
int n;cin>>n;int a[n+1],b[n+1];queue<int> q;
int last=0,d[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];q.push(a[i]);
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
last=max(last,q.front());
q.pop();
d[i]=b[i]-last;
last=b[i];
}
for(int i=1;i<=n;i++)cout<<d[i]<<" ";
cout<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
D. 前缀和维护遍历子区间即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=1e6+10;
const int maxn=5e4+10;
void solve(){
int n,k;cin>>n>>k;
string s;cin>>s;int a[n+1],minn=INF;int x;
for(int i=0;i<s.size();i++){
if(s[i]=='B')x=0;
if(s[i]=='W')x=1;
a[i]=a[i-1]+x;
}
for(int i=k-1;i<s.size();i++){
minn=min(minn,a[i]-a[i-k]);
}
cout<<minn<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
E. 我们分两部分 整除结果和 余数 再把余数配对即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=1e6+10;
const int maxn=5e4+10;
void solve(){
int n,k;cin>>n>>k;int ans=0,cnt[1005]={0},minn,sum=0;
for(int i=1;i<=n;i++){
int x;cin>>x;
ans+=x/k;
cnt[x%k]++;
}
for(int i=1,j=k-1;i<=j;i++,j--){
sum+=cnt[j];
if(i==j)break;
int t=min(sum,cnt[i]);
sum-=t;
ans+=t;
}
cout<<sum/2+ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}