比赛链接
A: 变成全奇或者全偶
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[110];
int main()
{
int n,o=0,e=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]%2==0) o++;
else e++;
}
cout<<min(o,e)<<endl;
}
B:倒着更新一下最小值,然后比较一下就好了
#include<bits/stdc++.h>
using namespace std;
const int N = 150000+100;
int a[N],mi[N];
int main()
{
int T;
cin>>T;
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
mi[i]=1e9;
}
mi[n+1]=1e9;
for(int i=n;i>=1;i--){
mi[i]=min(mi[i+1],a[i]);
}
int ans=0;
for(int i=1;i<=n;i++){
if(a[i]>mi[i]) ans++;
}
cout<<ans<<endl;
}
}
C:n和m都比较大所以我们可以先出求一个循环节,m ~ m*10,统计这个循环节的最低位之和。再暴力统计剩下的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int T;
cin>>T;
while(T--){
ll n,m;
scanf("%lld%lld",&n,&m);
ll tmp=0,blo=m*10;
for(int i=1;i<=10;i++)
tmp+=(m*i)%10;
ll cnt=(n/blo);
ll ans=cnt*tmp;
cnt*=blo;
for(int i=1;i<=10;i++){
ll t=cnt+i*m;
if(t<=n){
ans+=t%10;
}else break;
}
cout<<ans<<endl;
}
}
D1&D2:开一个优先队列q[i]保存每一个元素到i需要除多少下,然后遍历一遍找到最小值就好了。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int a[N];
priority_queue<int, vector<int>, greater<int>>q[N];
void gao(int x){
int cnt=0;
while(x){
q[x].push(cnt);
x/=2;
cnt++;
}
q[0].push(cnt);
}
int main()
{
int n,k,mx=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
gao(a[i]);
mx=max(mx,a[i]);
}
int ans=1e9;
for(int i=0;i<=mx;i++){
int tmp=0;
if(q[i].size()>=k){
int flag=0;
for(int j=1;j<=k;++j){
tmp+=q[i].top();
if(tmp>ans) flag=1;
if(flag) break;
q[i].pop();
}
if(flag)continue;
ans=min(ans,tmp);
}
}
printf("%d\n",ans);
}