- 伍衍 的博客
国庆模拟赛DAY04总结
- @ 2024-10-5 18:26:03
考试错误:无。
思路:暴力枚举。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
int a[N];
signed main(){
freopen("mod.in","r",stdin);
freopen("mod.out","w",stdout);
int n,l,r;
cin >> n >> l >> r;
for(int i=1;i<=n;i++){
cin >> a[i];
}
int mn=0xffffffff,mni=0;
for(int i=l;i<=r;i++){
int sum=0;
for(int j=1;j<=n;j++){
sum+=a[j]%i;
}
if(sum<mn) mni=i,mn=sum;
}
cout << mni;
}
考试错误:考试时思路是对的,但是写因数分解的时候本来只要求 和 的个数,我却写成了 到 ( ),后来改成 到 就对了 ( ) 。
思路: 质因数分解找出有多少个 和 ,再分别补齐到 个。把需要补齐的 和 相乘起来即可。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
pair<int,int> divide25(int n){
pair<int,int> cnt25=make_pair(0,0);
for(int i=2;i<=5;i++){
while(n%i==0){
n/=i;
if(i==2) cnt25.first++;
if(i==5) cnt25.second++;
}
}
return cnt25;
}
signed main(){
freopen("mul.in","r",stdin);
freopen("mul.out","w",stdout);
int t;
cin >> t;
while(t--){
int n,k;
cin >> n >> k;
int ans=1;
pair<int,int> _25=divide25(n);
if(zero>=k){
cout << 1 << endl;
continue;
}
for(int i=1;i<=k-_25.second;i++){
ans*=5;
}
for(int i=1;i<=k-_25.first;i++){
ans*=2;
}
cout << ans << endl;
}
}
考试错误:暴力骗了 分。
思路:
这题的思路不太好讲,我们先来用 模拟一下:
. 字典序最小的数组是:1 2 3 4 5 6 7 8
. 接下来我们算一下需要的逆序对总数:8*(8-1)/4=14
. 我们发现, 和 能够贡献出 个顺序对,所以只要将后面的数都倒过来,我们就得到了 个逆序对,那还有 个怎么办呢?我们可以把 挪到前面,这样就有 个逆序对了!
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
freopen("gz.in","r",stdin);
freopen("gz.out","w",stdout);
int n;
cin >> n;
int zxd=n*(n-1)/4,x=n;
while(zxd>=x){
zxd-=--x;
cout << n-x << " ";
}
zxd-=n;
zxd=abs(zxd);
cout << zxd << " ";
for(int i=n;i>=n-x+1;i--){
if(i!=zxd) cout << i << " ";
}
}