A
直接拆,计数。
#include<bits/stdc++.h>
using namespace std;
int main(){
int ans=0;
for(int i=2;i<=2020;i++){
int n=i;
while(n){
if(n%10==2) ans++;
n/=10;
}
}
cout<<ans;
return 0;
}
B
gcd(i,j)==1表示i和j互质,也就是题目所说的既约分数,把i当成分子,j当成分母,暴力计数即可。
#include<bits/stdc++.h>
using namespace std;
int gcd(int x,int y){
int a=max(x,y);
int b=min(x,y);
int temp;
while(a%b){
temp=a;
a=b;
b=temp%b;
}
return b;
}
bool judge(int x,int y){
if(gcd(x,y)==1) return 1;
return 0;
}
int main(){
int ans=0;
for(int i=1;i<=2020;i++){
for(int j=1;j<=2020;j++){
if(judge(i,j)) ans++;
}
}
cout<<ans;
return 0;
}
C
蛇形填数,模拟题。
#include<bits/stdc++.h>
using namespace std;
int a[100][100];
int dir[4][2]={
{-1,1},{0,1},{1,-1},{1,0}
};
bool judge(int x,int y){
if(x>=1&&y>=1) return 1;
return 0;
}
int main(){
int cnt=1;
int p=1;
int i=1,j=1;
a[i][j]=cnt++;
while(p<=40){
//a[i][j]=cnt++;
//cout<<i<<" "<<j<<endl;
j+=1;
a[i][j]=cnt++;
//cout<<i<<" "<<j<<endl;
while(j!=1&&judge(i,j)){
j-=1;
i+=1;
a[i][j]=cnt++;
//cout<<i<<" "<<j<<endl;
}
i+=1;
a[i][j]=cnt++;
//cout<<i<<" "<<j<<endl;
while(i!=1&&judge(i,j)){
j+=1;
i-=1;
a[i][j]=cnt++;
//cout<<i<<" "<<j<<endl;
}
p++;
}
for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<a[20][20];
return 0;
}
D
我做麻烦了,反正是离线,就多造了些判断,处理二月份天数的时候比较墨迹。也是一道模拟题。
用一个变量记录天数,一个变量记录周几,然后判段更新。
#include<bits/stdc++.h>
using namespace std;
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int ml[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
long long ans=0;
int d=1;
int mm=1;
int ye=2000;
int f=6;
int temp=0;
while(!(ye==2020&&mm==10&&d==2)){
ans++;
if(d==1||f==1) ans++;
d++;
f++;
if(f>7) f=1;
if(temp){
if(d>ml[mm]){
d=1;
mm++;
}
}else{
if(d>m[mm]){
d=1;
mm++;
}
}
if(mm>12){
mm=1;
ye++;
}
if(ye==2000||ye==2004||ye==2008||ye==2012||ye==2016||ye==2020){
temp=1;
}else{
temp=0;
}
//cout<<ye<<" "<<mm<<" "<<d<<endl;
}
cout<<ans;
return 0;
}
E
有点难受。(看了大佬的代码)
为什么要dfs,因为题目说发光的二极管是要连续的。
怎么构建连续,观察那个8,我们发现a与f,b相连,f与g,e相连,等等。
然后用数组存,会发现一个问题,即b可以到c,g也可以到c,如果直接搜怎么存合适,我们用一个#补充这个位置,代表这是一个没有字母但是可以通过的路,在搜素时可以判断一下#,然后拼接。
其它的没啥了,枚举每一个位置,然后搜素,先排序,然后用set去重一下。
#include<bits/stdc++.h>
using namespace std;
char str[8][8]={
{'a','b','#'},{'f','g','c'},{'#','e','d'}
};
int dir[4][2]={
{-1,0},{0,-1},{1,0},{0,1}
};
int vis[8][8];
set<string> se;
string qsort(string s){
char p[10];
memset(p,'#',sizeof(p));
int n=0;
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]!='#'){
p[n++]=s[i];
}
}
sort(p,p+n);
string qq;
for(int i=0;i<n;i++){
qq+=p[i];
}
return qq;
}
bool judge(int x,int y){
if(x>=0&&y>=0&&x<3&&y<3&&!vis[x][y]) return 1;
return 0;
}
void dfs(int x,int y,string t){
vis[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(judge(xx,yy)){
string tem=qsort(t+str[xx][yy]);
se.insert(tem);
vis[xx][yy]=1;
dfs(xx,yy,tem);
vis[xx][yy]=0;
}
}
return ;
}
int main(){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(str[i][j]!='#'){
string s;
s+=str[i][j];
string q=qsort(s);
se.insert(q);
memset(vis,0,sizeof(vis));
dfs(i,j,q);
}
}
}
cout<<se.size();
return 0;
}
答案:
(1)624
(2)2481215
(3)761
(4)8879
(5)80
程序题后面再补。