1、门牌制作
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int count=0,x;
cin>>x;
for(int i=1;i<=x;i++){
while(i>0){
if(i%10==2)
count++;
i/=10;
}
}
cout<<count<<endl;
}
输出:624
2、既约分数
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int gcd(int a,int b){
if(a%b==0)
return b;
return gcd(b,a%b);
}
int main(){
int num=0;
for(int i=1;i<=2020;i++){
for(int j=i+1;j<=2020;j++){
if(gcd(i,j)==1){
num++;
}
}
}
cout<<num*2+1<<endl;
return 0;
}
输出:2481215
3、蛇形填数
可以看成一个三角形。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n=38; //可以看成一个三角形第20列为2*20-1,n记录之前的行数
int sum=(1+n)*n/2; //先将所在列之前行数求出
sum+=39/2+1;
cout<<sum<<endl;
}
输出:761
4、七段码
图论,并查集
将每一个灯管看作节点连边建图,然后dfs搜索所有的状态,判断每一个状态是否可行
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[30]={0},e[10][10],f[10],ans=0;
int n=7;
//先建图
//a b c d e f g
//1 2 3 4 5 6 7
void init(){
e[1][2]=e[1][6]=1;
e[2][1]=e[2][7]=1;
e[6][1]=e[6][7]=1;
e[7][2]=e[7][6]=e[7][5]=e[7][3]=1;
e[5][7]=e[5][4]=1;
e[3][7]=e[3][4]=1;
e[4][3]=e[4][5]=1;
e[2][3]=e[3][2]=1;
e[5][6]=e[6][5]=1;
}
int find(int x){
if(x!=f[x]){
return f[x]=find(f[x]);
}
return f[x];
}
void dfs(int u,int v,int m){
if(u==m){
for(int i=1;i<10;i++){
f[i]=i;
}
for(int i=0;i<m;i++){
for(int j=i+1;j<m;j++){
if(e[a[i]][a[j]]==1){
f[find(a[i])]=find(f[a[j]]);
}
}
}
bool xx=0;
for(int i=0;i<m-1;i++){
if(find(a[i])!=find(a[i+1])){
xx=true;
break;
}
}
if(!xx){
ans++;
}
return ;
}
for(int i=v;i<=n;i++){
a[u]=i;
dfs(u+1,i+1,m);
}
}
int main(){
init();
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++){
dfs(0,1,i);
}
cout<<ans<<endl;
return 0;
}
输出:80
5、跑步锻炼
遍历枚举,主要闰年2月份,各个月份大小,之后就可以求出结果了
#include<iostream>
#include<algorithm>
using namespace std;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int year1=2000,year2=2020,month1=1,month2=10,day1=1,day2=1;
int week=6;
long long int sum=0;
for(year1;year1<=year2;year1++){
if((year1%400==0)||(year1%4==0&&year1%100!=0)){
months[2]=29;
}
else
months[2]=28;
for(int i=1;i<=12;i++){
for(int day=1;day<=months[i];day++){
if(day==1||week==1){
sum+=2;
}
else{
sum+=1;
}
week=(week+1)%7;
if(year1==2020&&i==10&&day==1){
cout<<sum<<endl;
return 0;
}
}
}
}
return 0;
}
输出:8879
6、回文日期
还不会
7、字串排序
还没学会
8、成绩统计
#include<iostream>
using namespace std;
int main()
{
int n;
double a=0,b=0;
cin>>n;
int x;
for(int i=1;i<=n;i++){
cin>>x;
if(x>=60) a++;
if(x>=85) b++;
}
int c=a/(n/100.0)+0.5;
int d=b/(n/100.0)+0.5; //因为四舍五入,所以加0.5
cout<<c<<"%"<<endl<<d<<"%"<<endl;
return 0;
}
9、子串分值和
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int n,x[600];
string s;
main(){
int sum=0;
cin>>s;
n=s.size();
s=" "+s;
for(int i=1;i<=n;i++){
sum+=(i-x[s[i]])*(n-i+1);
x[s[i]]=i;
}
cout<<sum<<endl;
return 0;
}
10、平面切分
一开始不是很清楚,后来看了一些大佬的思路才知道,但还是有些不理解
可以知道每增加一条直线,对平面数的贡献值是其与先前直线的交点数(不重合)+1
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int main()
{
int n;
cin>>n;
int a,b;
long long ans=2;
long double A[N],B[N];
pair<long double,long double> p;
set<pair<long double,long double> > s;
for(int i=0;i<n;i++){
cin>>a>>b;
p.first=a;
p.second=b;
s.insert(p);
}
int i=0;
for(set<pair<long double, long double> >::iterator it=s.begin();it!=s.end();it++,i++){
A[i]=it->first;
B[i]=it->second;
}
for(int i=1;i<s.size();i++){
set<pair<long double, long double> > pos;
for(int j=i-1;j>=0;j--){
int a1=A[i],b1=B[i];
int a2=A[j],b2=B[j];
if(a1==a2)
continue;
p.first=1.0*(b2-b1)/(a1-a2);
p.second=1.0*a1*((b2-b1)/(a1-a2))+b1;
pos.insert(p);
}
ans+=pos.size()+1;
}
printf("%d\n",ans);
return 0;
}