填空题
1.空间
比赛的时候不知道MB内存空间和二进制整数之间的关系,原来就一个256*1024*1024*8/32的简单式子的关系。
即1MB=1024KB,1KB=1024B,1B=8b
2.卡片
比赛的时候不会写程序,直接笔算加心算~~
答案是3181
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[10];
int main()
{
for(int i=0;i<10;i++)
a[i] = 2021;
int res = 1;
bool flag = true;
int num;
while(flag)
{
int r = res;
while(r)
{
num = r % 10;
if(!a[num])
{
flag = false;
break;
}
a[num]--;
r /= 10;
}
if(flag)
res++;
}
cout<<res-1<<endl;
return 0;
}
3.直线
题目都没看懂#!!!
待补
4.货物摆放
题目给的数很大,比赛的时候直接暴力两重循环,结果绝对超时了!
按照题目,符合条件的肯定都是n的约数,只要把n的所有约数求出来再一一循环检验就可以了, 2021041820210418只有128个约数,计算出结果
答案2430
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1e4+5;
long long int ys[maxn];
int k=0;
long long int i;
void init(long long int n){
for(i=1;i*i<=n;i++){
if(n%i==0){
if(i==n/i){
ys[k++]=i;
}else{
ys[k++]=i;
ys[k++]=n/i;
}
}
}
}
int main(){
long long int a;
while(cin>>a){
init(a);
sort(ys,ys+k);
int ans=0;
for(int i=0;i<k;i++){
for(int j=0;j<k;j++){
if(ys[i]*ys[j]>a){
break;
}
for(int p=0;p<k;p++){
if(ys[i]*ys[j]*ys[p]==a){
ans++;
}
}
}
}
cout<<ans<<endl;
return 0;
}
return 0;
}
5.
比赛的时候看题好疑惑,觉得最短路径难道不是1到2吗,后来往si里看,噢,原来是求1到2021的最短路径~
答案是10266837
#include<iostream>
using namespace std;
#include <bits/stdc++.h>
#define MAXN 3007
#define ll long long
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; }
ll d[MAXN][MAXN];
vector<ll> G[MAXN];
int main() {
memset(d,0x3f,sizeof(d));
for (int i=1;i<=2021;i++) d[i][i]=0;
for (ll i=1;i<=2021;i++)
for (ll j=1;j<=2021;j++)
if (abs(i-j)<=21) d[i][j]=d[j][i]=i*j/gcd(i,j);
for (ll k=1;k<=2021;k++)
for (ll i=1;i<=2021;i++)
for (ll j=1;j<=2021;j++)
if (d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];
cout<<d[1][2021];
return 0;
}