第 1 题:卡片
思路:直接暴力,需要注意是要完整拼完
#include<bits/stdc++.h>
using namespace std;
int f[10];
bool solve(int n)
{
while(n)
{
int t=n%10;
if(f[t]<2021)
f[t]++;
else
return true;
n/=10;
}
return false;
}
int main()
{
int n=1;
while(true)
{
if(solve(n)){
//因为要完整拼完,而此时的n是未拼完的状态,因此最大的是它的前一个数
cout<<n-1<<endl;
break;
}
n++;
}
}
第 2 题:路径
思路1:dijktra算法
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N=3000;
int g[N][N],dis[N],vis[N];
int gcd(int m,int n){
while(n!=0){
int temp=m%n;
m=n;
n=temp;
}
return m;
}
int lem(int m,int n){
int b=gcd(m,n);
return m*n/b;
}
int dijktra(){
memset(dis,0x3f,sizeof dis);
memset(vis,0,sizeof vis);
dis[1]=0;
for(int i=1;i<=2021;i++){
int mini=0,min_=0x3f3f3f3f;
for(int j=1;j<=2021;j++){
if(!vis[j]&&dis[j]<min_){
mini=j;
min_=dis[j];
}
}
if(mini==0)break;
vis[mini]=1;
for(int i=1;i<=2021;i++){
if(dis[i]>dis[mini]+g[mini][i])
dis[i]=dis[mini]+g[mini][i];
}
}
return dis[2021];
}
int main(){
memset(g,0x3f,sizeof g);
for(int i=1;i<=2021;i++){
for(int j=1;j<=2021;j++){
if(abs(i-j)<=21){
g[i][j]=lem(i,j);
}
}
}
int s=dijktra();
cout<<s<<endl;
return 0;
}
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll ans[3000];
int main() {
memset(ans,0x3f,sizeof(ans));
ans[1]=0;
for(int i=1;i<=2021;i++){
for(int j=1;j<=21&&i+j<=2021;j++){
ans[i+j]=min(ans[i+j],ans[i]+i*(i+j)/__gcd(i,i+j));
}
}
cout<<ans[2021]<<endl;
return 0;
}
网上看到的一个很炸裂的答案
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<n;
return 0;
}
第 3 题:字符统计
思路:暴力
#include <iostream>
using namespace std;
int f[26];
int main()
{
string arr;
cin>>arr;
int max1=0;
for(int i=0;i<arr.length();i++)
{
f[arr[i]-'A']++;
max1=max(f[arr[i]-'A'],max1);
}
for(int i=0;i<26;i++)
{
if(f[i]==max1)
cout<<char('A'+i);
}
return 0;
}