门牌制作
#include<iostream>
using namespace std;
int main(){
int ans=0;
for(int i=1;i<2021;i++){
int m=i;
while(m!=0){
if(m%10==2){
ans++;
}
m=m/10;
}
}
cout<<ans;
return 0;
}
624
既约分数
- 二重循环内赋值一个n,m很关键,不然改变循环变量了
#include<bits/stdc++.h>
using namespace std;
int gcd(int n,int m){
return m==0?n:gcd(m,n%m);
}
void swap(int*a,int*b){
int*t;
t=a;
a=b;
b=t;
}
int main(){
int ans=0;
for(int i=1;i<=2020;i++){
for(int j=1;j<=2020;j++){
int n=i,m=j;
if(n<m){
swap(n,m);
}
if(gcd(n,m)==1){
ans++;
}
}
}
cout<<ans;
}
2481215
蛇形填数
手画画就出来了
1+42019/2
761
跑步锻炼
- 犯了一个错误,==少写一个,找个半天bug
- 还犯了一个错误,ans+2排除之后忘了写else
memcpy函数可以复制需要<cstring>头文件,
复制方法是
memcpy(copy,sourse,sizeof(copy));
#include<bits/stdc++.h>
using namespace std;
int ifyear(int y){
if((y%4==0&&(y%100!=0))||y%400==0){
return 1;
}
return 0;
}
int months1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int months2[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int months[12];
int days=1;
int ans=0;
int md;
int main(){
for(int y=2000;y<=2019;y++){
if(ifyear(y))memcpy(months,months2,sizeof(months));
else memcpy(months,months1,sizeof(months));
for(int m=0;m<=11;m++){
md=months[m];
for(int d=1;d<=md;d++){
if(d==1||(days+5)%7==1){
ans+=2;
}
else ans++;
days++;
}
}
}
memcpy(months,months2,sizeof(months));
for(int m=0;m<=8;m++){
md=months[m];
for(int d=1;d<=md;d++){
if(d==1||(days+5)%7==1){
ans+=2;
}
else ans++;
days++;
}
}
ans+=2;
cout<<ans;
}
8879
七段码
想直接暴力写的,但是多算了,主要是是否处于同样一个连通器这件事情不好表示,看了别人思路发现是用dfs+并查集。也许可以尝试下硬数?反正总共128种,可能20分钟也数完了。
- dfs忘了写return一直转
#include<iostream>
#include<vector>
using namespace std;
vector<int>pre(8);
vector<int>light(8);
int ans=0;
//邻接矩阵
vector<vector<int>>dis={
{0,1,0,0,0,1,0},
{1,0,1,0,0,0,1},
{0,1,0,1,0,0,1},
{0,0,1,0,1,0,0},
{0,0,0,1,0,1,1},
{1,0,0,0,1,0,1},
{0,1,1,0,1,1,0},
};
//并查集
int find(int x){
if(x!=pre[x]){
return pre[x]=find(pre[x]);
//路径压缩
}
return pre[x];
}
void dfs(int d){
if(d>7){
for(int i=1;i<=7;i++)pre[i]=i;
for(int i=1;i<=7;i++){
for(int j=1;j<=7;j++){
if(dis[i-1][j-1]&&light[i]&&light[j]){
int X=find(i);
int Y=find(j);
if(X!=Y)pre[X]=Y;
}
}
}
int k=0;//连通器的个数
for(int i=1;i<=7;i++){
if(light[i]&&pre[i]==i)k++;
}
if(k==1)ans++;
return;
}
light[d]=1;
dfs(d+1);
light[d]=0;
dfs(d+1);
}
int main(){
dfs(1);
cout<<ans;
return 0;
}
成绩统计
算下最大值最小值平均分就行
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int main(){
int n;
int max=-100;
int min=101;
int sum=0;
cin>>n;
vector<int>point(n);
for(int i=0;i<n;i++){
cin>>point[i];
if(point[i]>max)max=point[i];
if(point[i]<min)min=point[i];
sum+=point[i];
}
double ave=(double)sum/n;
printf("%d\n",max);
printf("%d\n",min);
printf("%.2f",ave);
return 0;
}
回文日期
写了半天10个例子还5个超时,懒得优化了
- 判断闰年是%不是/,老写错
#include<bits/stdc++.h>
using namespace std;
int months1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int months2[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int ifyear(int y){
if(((y%4==0)&&(y%100!=0))||y%400==0){
return 1;
}
return 0;
}
int main(){
int n,ans1,ans2,a,b;
int months[12];
scanf("%d",&n);
int y0=n/10000-1;
int y=y0;
int d0=n%100;
int m0=(n/100)%100;
while(1){
y=y+1;
int t=y;
int s[4];
for(int i=0;i<4;i++){
s[i]=t%10;
t/=10;
}
int m,d;
m=s[0]*10+s[1];
d=s[2]*10+s[3];
if(m0>m||(m0==m&&d0>=d))continue;
if(m>12||m<1)continue;
if(ifyear(y)==1){
memcpy(months,months2,sizeof(months));
}
else{
memcpy(months,months1,sizeof(months));
}
if(d>months[m-1]||d<1)continue;
ans1=y*10000+s[0]*1000+s[1]*100+s[2]*10+s[3];
break;
}
cout<<ans1<<endl;
a=n/10000000;
b=(n/1000000)%10;
int x=b*10+a;
int year=a*1010+b*101;
int flag=1;
y0=y0+1;
if(year>y0||(year==y0&&x>m0)||(year==y0&&x==m0&&x>d0))flag=0;
if(x>12||x<1)flag==1;
if(ifyear(y)==1){
memcpy(months,months2,sizeof(months));
}
else{
memcpy(months,months1,sizeof(months));
}
if(x>months[x-1]||x<1)flag=1;
if(flag==0){
int y=a*1000+b*100+a*10+b;
ans2=y*10000+x*100+x;
}
while(flag){
if(b==9){
a++;
b=0;
}
else b++;
int x=b*10+a;
if(x>12||x<1)continue;
int y=a*1000+b*100+a*10+b;
if(ifyear(y)==1){
memcpy(months,months2,sizeof(months));
}
else{
memcpy(months,months1,sizeof(months));
}
if(x>months[x-1]||x<1)continue;
ans2=y*10000+x*100+x;
break;
}
cout<<ans2;
return 0;
}
可以看下这篇的解答
别人的题解
子串分值
暴力出40分,收工
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int n=s.size();
set<char>a;
int ans=0;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
a.clear();
for(int k=i;k<=j;k++){
a.insert(s[k]);
}
ans+=a.size();
}
}
cout<<ans;
return 0;
}
平面切分
这个程序能过6个例,可以了,每新增一个直线,会增加交点数+1个平面
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
double x,y;
scanf("%d",&n);
vector<vector<int> >a(n+1,vector<int>(2));
for(int i=0;i<n;i++){
scanf("%d%d",&a[i][0],&a[i][1]);
}
int ans=2;
for(int i=1;i<n;i++){
pair<double,double>d[1500]={};
int u=0;
ans++;
for(int j=0;j<i;j++){
if(a[i][0]!=a[j][0]){
x=(double)(a[j][1]-a[i][1])/(double)(a[i][0]-a[j][0]);
y=a[i][0]*x+a[i][1];
d[u++]={x,y};
}
}
sort(d,d+u);
ans++;
for(int k=1;k<u;k++){
if(fabs(d[k].first-d[k-1].first)<1e-8&&fabs(d[k].second-d[k-1].second)<1e-8)continue;
ans++;
}
}
cout<<ans;
return 0;
}