c 处理出每个点的后有多少子弹比当前子弹打,然后从前往后遍历即可
ll n,m;
void solve(){
cin>>n;
vector<int> a(n+1);
rep(i,1,n)cin>>a[i];
vector<int> suf(n+1),cnt(200,0),pre(n+1);
per(i,n,1){
int x = a[i],sum = 0;
rep(j,x+1,100)sum+=cnt[j];
suf[i]=sum;cnt[x]++;
}
int x;cin>>x>>x;
rep(i,1,n)pre[i]=pre[i-1]+(a[i]>x?1:0);
int tot = pre[n],mi = inf;
rep(i,1,n){
int cur = pre[i]+suf[i];
mi=min(cur,mi);
}
cout<<min(mi,tot);
return;
}
d
注意到所有字符串gcd不唯一时,必须将所有字符调整为一致
否则,设t为所有长度的gcd,将每个字符串切割为n个t,统计每个数位上字符出现次数,将字符变为出现次数最大的即可
ll n,m;
void solve(){
cin>>n;
vector<string> a(n+1);
vector<int> l(n+1);
rep(i,1,n)cin>>a[i];
rep(i,1,n)l[i]=(int)a[i].length();
int x = l[1];
rep(i,2,n)x=__gcd(x,l[i]);
if(x==1){
vector<int> c(27);
rep(i,1,n){
for(auto s:a[i])c[s-'a'+1]++;
}
int mx = 0;
rep(i,1,26)mx=max(mx,c[i]);
ll tot = 0;
rep(i,1,n)tot+=l[i];
cout<<tot-mx<<"\n";return ;
}
vector<vector<int>> cnt(x+1,vector<int>(27,0));
vector<int>tot(x+1,0);
rep(i,1,n){
rep(j,0,l[i]-1){
cnt[j%x][a[i][j]-'a'+1]++;
tot[j%x]++;
}
}
ll ans = 0;
rep(i,0,x){
int mx = 0;
rep(j,1,26)mx=max(mx,cnt[i][j]);
ans+=tot[i]-mx;
}
cout<<ans;
return;
}
e
问题等价为:将数组中全部元素+1或-1,问是否所有元素不相同,同时每个元素的值大于等于2*其下标
考虑贪心,从后往前,优先变大,其次变小,只要出现重复即输出no
赛时代码有点丑
ll n,m;
void solve(){
cin>>n;
vector<int> a(n+1),b(n+1);
rep(i,1,n)cin>>a[i];
sort(a.begin()+1,a.end());
rep(i,1,n)b[i]=a[i];
map<int,int> mp;
rep(i,1,n)mp[a[i]]++;
for(auto[u,v]:mp){
if(v>2){
cout<<"NO\n";return;
}
}
map<int,int> vis;
per(i,n,1){
int cur = b[i];
if(cur==1){
if(vis[2]){
cout<<"NO\n";return ;
}else{
vis[2]=1;b[i]=2;
}
}else{
if(!vis[cur+1]){
vis[cur+1]=1;b[i]++;
}else if(!vis[cur-1]){
vis[cur-1]=1;b[i]--;
}else{
cout<<"NO\n";return ;
}
}
}
sort(b.begin()+1,b.end());
// rep(i,1,n)cout<<b[i]<<" ";cout<<"\n";
int now = 0,pre = 0;
rep(i,1,n){
now+=b[i]-pre;now-=2;pre=b[i];
if(now<0){
cout<<"NO\n";return ;
}
}
cout<<"YES\n";return ;
return;
}