A
624
atraviesa cada número, toma el resto para juzgar cada bit
#include<iostream>
using namespace std;
int main()
{
int cnt=0;
for(int i=1;i<=2020;i++)
{
int tmp=i;
while(tmp)
{
if(tmp%10==2)
cnt++;
tmp/=10;
}
}
cout<<cnt;
return 0;
}
B
2481215
dos ciclos para determinar si el máximo común divisor es 1
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int cnt=0;
for(int i=1;i<=2020;i++)
for(int j=1;j<=2020;j++)
if(gcd(i,j)==1)
cnt++;
cout<<cnt;
return 0;
}
C
761
Encontrar la ley directamente es más rápido
(1,1) 1 = 0 + 1
(2,2) 5 = (1 + 2) +2
(3,3) 13 = (1 + 2 + 3 + 4) +3
( i, I) x = (1 + 2 + 3 +… + 2 (i-1)) + i = (i-1) (2i-1) + i
con código de relleno en forma de serpiente
#include<iostream>
using namespace std;
int a[1001][1001];
int main()
{
int cnt=1;
int i=1,j=1;
a[i][j]=cnt;
while(cnt<10000)
{
if(i==1)
j++;
a[i][j]=++cnt;
while(j>1)
a[++i][--j]=++cnt;
if(j==1)
i++;
a[i][j]=++cnt;
while(i>1)
a[--i][++j]=++cnt;
}
cout<<a[20][20];
return 0;
}
D
80
mapas de construcción, dfs. Cada luz puede estar encendida o apagada, enumere 2 ^ 7.
#include<iostream>
using namespace std;
const int N=8;
int map[N][N],fa[N],vis[N],ans;
int getfa(int i) //寻找根节点
{
if(fa[i]==i)
return i;
return fa[i]=getfa(fa[i]); //压缩路径
}
void dfs(int k)
{
if(k>7) //7个灯都枚举完了
{
for(int i=1;i<=7;i++) //先把自己设为自己的父节点
fa[i]=i;
for(int i=1;i<=7;i++)
for(int j=1;j<=7;j++)
{
if(map[i][j]&&vis[i]&&vis[j]) //将连通且亮着的灯,并在一块
{
int faa=getfa(i),fab=getfa(j);
if(faa!=fab)
fa[faa]=fab;
}
}
int cnt=0;
for(int i=1;i<=7;i++) //有几个根节点说明有几个集合
if(fa[i]==i&&vis[i]) //亮着的灯的集合数
cnt++;
if(cnt==1) //都连通的话,只有一个集合
ans++;
return;
}
vis[k]=1; //k灯亮 dfs中k+1亮和灭
dfs(k+1);
vis[k]=0; //k灯灭
dfs(k+1);
}
int main()
{
map[1][2]=map[2][1]=1;map[1][6]=map[6][1]=1; //连通的存图
map[6][7]=map[7][6]=1;map[6][5]=map[5][6]=1;
map[2][7]=map[7][2]=1;map[2][3]=map[3][2]=1;
map[5][7]=map[7][5]=1;map[5][4]=map[4][5]=1;
map[3][7]=map[7][3]=1;map[4][3]=map[3][4]=1;
dfs(1);
cout<<ans;
return 0;
}
mi
1391
Entre rectas arbitrarias (incluidas rectas y curvas) que no se intersecan en el mismo punto, el plano se puede dividir en tantas partes como sea posible.
Según el teorema de Euler V − E + F − T = 1, T = 0, Resuelva para F = 1 + E − V, solo necesita resolver el número de puntos V y el número de lados V.
Según nuestro análisis, dos líneas rectas cualesquiera pueden tener un punto de intersección, el número es (202); hay dos puntos de intersección entre dos círculos cualesquiera, el número es 2⋅ (202); hay dos puntos de intersección entre un círculo arbitrario y una línea recta, el número es 20 × 20 × 2,
entonces V = (202) +2 ⋅ (202) + 20 × 20 × 2 = 1370 Lo
mismo es cierto En nuestro análisis, una línea recta se interseca con las 19 líneas rectas restantes en un punto cada una, y 20 círculos se intersecan en dos puntos cada uno, por lo que hay 19 + 20 × 2 = 59 puntos en la línea, y una línea recta se divide en 60 lados; un círculo se interseca con los 19 círculos restantes y 20 líneas rectas en dos puntos cada uno, un total de (19 + 20) × 2 = 78 puntos, un círculo se divide en 78 lados,
por lo que E = 60 × 20 + 78 × 20 = 2760,
por lo tanto, obtiene la respuesta: F = 1 + 2760−1370 = 1391
F
#include<iostream>
#include<cstdio>
using namespace std;
int a[100001];
int main()
{
int n,maxx=-1,minn=101;
cin>>n;
long long s=0;
double ave;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s+=a[i];
maxx=max(maxx,a[i]);
minn=min(minn,a[i]);
}
ave=s/double(n);
printf("%d\n%d\n%.2lf",maxx,minn,ave);
}
GRAMO
Juzga cada fecha, toma el resto de la fecha, almacena cada bit en la matriz y juzga si lo correspondiente es igual o no.
Presta atención para juzgar que la fecha es legal
#include<iostream>
using namespace std;
int main()
{
int n,ans1=0,ans2=0;
int a[10];
cin>>n;
for(int i=n+1;;i++)
{
int j=1;
int tmp=i;
while(j<=8)
{
a[j++]=tmp%10;
tmp/=10;
}
bool flag=0;
int m=a[5]*10+a[6],k=a[7]*10+a[8],y;
switch(m)
{
case 4:
case 6:
case 9:
case 11:
if(m>30) flag=1;
break;
case 2:
y=a[1]*1000+a[2]*100+a[3]*10+a[4];
if((y%4==0&&y%100!=0)||y%400==0) {
if(m>29) flag=1;break;}
else {
if(m>28) flag=1;break;}
default:
if(m>31) flag=1;
break;
}
if(flag)
continue;
if(a[1]==a[3]&&a[1]==a[6]&&a[1]==a[8]&&a[2]==a[4]&&a[2]==a[5]&&a[2]==a[7])
for(int j=8;j;j--)
{
ans2*=10;
ans2+=a[j];
}
if(a[1]==a[8]&&a[2]==a[7]&&a[3]==a[6]&&a[4]==a[5]&&!ans1)
for(int j=8;j;j--)
{
ans1*=10;
ans1+=a[j];
}
if(ans1&&ans2)
break;
}
cout<<ans1<<endl<<ans2;
return 0;
}
H
Se puede enumerar y realizar un ciclo triple. De esta manera, n debe ser menor que 100. Obviamente no es el
número de subcadenas aportadas por cada letra. Su subíndice es el valor absoluto del subíndice de la misma letra antes y después. la misma letra. Multiplica, y luego acumula cada letra es la respuesta. Por
ejemplo, esta cadena en la figura, cuente el número de subcadenas de contribución de la posición 4 a, el
primer subíndice es 1 y el último es 6 (4 -1) * (6 -4) = 6
Explique que 4-1 corresponde a bca (No. 234) y 6-4 corresponde a ab (No. 45)
. Las subcadenas con bca como posición inicial y ba como final todas las posiciones contienen solo la cuarta a, y es una subcadena
que contiene solo la cuarta a, es decir, bca bcab ca cab a ab.
Tenga en cuenta que al principio, puede que no haya la misma letra antes o después
#include<iostream>
#include<string>
using namespace std;
const int N=1e5+5;
int pre[N],nex[N],a[27];
string s;
int main()
{
cin>>s;
s="0"+s; //下标从1开始
int n=s.length()-1; //长度
for(int i=1;i<=n;i++) //寻找前一个相同字符下标
{
int c=s[i]-'a';
pre[i]=a[c];
a[c]=i;
}
for(int i=0;i<26;i++) //初始化,可能后边没有相同字符 寻找前一个时,未初始,因为a数组默然为0
a[i]=n+1;
for(int i=n;i;i--) //寻找后一个相同字符下标
{
int c=s[i]-'a';
nex[i]=a[c];
a[c]=i;
}
long long int ans=0;
for(int i=1;i<=n;i++)
ans+=(long long)(i-pre[i])*(nex[i]-i);//相乘计算累加
cout<<ans;
return 0;
}
I
Encuentra el área de la parte superpuesta de la elipse y el triángulo, no me perdones
J
Uh uh uh, todavía no, ¿
quién me enseñará orz?