第十一届蓝桥杯c++b组

蓝桥杯里面很多时候对于数字的精度很有要求,比如最后两题,他对于交点可能产生小数点,所以需要他的a,b都设为long double提高精度,然后就是make_pair(long double,long double)不然就无法通过测试点,也很容易想到,如果都四舍五入将会产生很多重复的点,也就无法存入set中,导致结果的偏差
门牌制作
结果624

#include<iostream>
using namespace std;
int ans=0;
void count(int num){
	while(num){
		if(num%10==2)
		  ans++;
		num/=10;
	}
}
int main(){
	for(int i=1;i<=2020;i++)
	   count(i);
	   cout<<ans<<endl;
	
	
	return 0;
} 

既约分数
2481215

#include<iostream>
using namespace std;
int ans=0;
bool test(int a,int b){//a为分子,b为分母
   for(int i=2;i<=a;i++)
    if(a%i==0&&b%i==0)
    	return false;
	return true; 
	
}
int main(){
	for(int i=1;i<=2020;i++){
		for(int j=1;j<=2020;j++)
		if(test(i,j))
		  ans++;
	}
	cout<<ans<<endl;
	
	return 0;
} 

使用辗转相除简单一点

#include<iostream>
using namespace std;
int ans=0;
int test(int a,int b){
	if(b==0) return a;
	else return test(b,a%b);
}
int main(){
	for(int i=1;i<=2020;i++){
		for(int j=1;j<=2020;j++)
		if(test(i,j)==1)
		  ans++;
	}
	cout<<ans<<endl;
	
	return 0;
} 
#include<iostream>
#include<algorithm>
using namespace std;
int ans;
int main(){
	for(int i=1;i<=2020;i++){
		for(int j=1;j<=2020;j++){
			if(__gcd(i,j)==1){
				ans++;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
} 

蛇形填数
761

#include<iostream>
using namespace std;

int main(){
	int ans[41][41];
	int begin=1;
	for(int i=1;i<=40;i++){
		int temp=i;
		if(i%2==1){
				for(int j=1;j<=i;j++){
					ans[temp][j]=begin;
					temp--;
					begin++;
	    	}
		}
	
		else {
			for(int j=i;j>=1;j--){
				temp=1;
				ans[temp][j]=begin;
				 temp++;
				 begin++;
			}
		}
	}
	cout<<ans[20][20]<<endl;
	return 0;
}

跑步锻炼
8879

#include<iostream>
using namespace std;

int main(){
	/*
	ans=总的天数+周一的天数+月初的天数-既是周一又是月初的天数
	所以 ans= 总的天数+周一的天数+是月初但不是周一的天数
	方便计算周一的天数  
	**/
    int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int totaldays=0;
    int addtion=0;
    for(int i=2000;i<=2020;i++){
    	if(i%4==0&&i%100!=0||i%400==0)
    	months[2]=29;
    	else months[2]=28;
    	int end=12;
    	if(i==2020)
    	end=9;
    	for(int j=1;j<=end;j++){
    		totaldays+=months[j];
    		if((totaldays+6)%7!=1)
    		addtion++;//记录月初但不是周日的日子 
		}
	}
	//计算到2020年九月底  还有十月一日周四
	totaldays+=1;
	addtion+=1;
	//计算所有的周一
	addtion+=(totaldays-2+6)/7; //只要有余数就多一个周一,所以+6,保证满1进位 
	int ans=totaldays+addtion;
	cout<<ans;
	return 0;
}
七段码
80
#include<iostream>
using namespace std;
int ans=0;
int used[8],node[8];
int map[8][8];
void init(){
	/*
	a b c d e f g
	1 2 3 4 5 6 7
	**/ 
  	map[1][1]=map[1][2]=map[1][6]=1;
	map[2][2]=map[2][3]=map[2][7]=1;
	map[3][3]=map[3][4]=map[3][7]=1;
	map[4][4]=map[4][5]=1;
	map[5][5]=map[5][6]=map[5][7]=1;
	map[6][6]=map[6][7]=1;
	map[7][7]=1;
} 
void initnode(){
	for(int i=1;i<=7;i++)
	   node[i]=i;
}
int find(int root){
	if(node[root]==root)
	  return root;
	return find(node[root]);
}
void dfs(int begin){
	if(begin>7){
	 initnode();
      for(int i=1;i<=7;i++){
      	    if(used[i]==1){
      		    for(int j=1;j<=7;j++){
      			    if(used[j]&&map[i][j]==1){
      					int roota=find(i),rootb=find(j);
      					if(roota!=rootb)
      					node[rootb]=roota;
				 	}
			   }
		    }
	    }
	 
	 int pile=0;
	 for(int i=1;i<=7;i++)
	 if(used[i]&&node[i]==i) pile++;
	 if(pile==1)	ans++;
	 return;
	}
	used[begin]=1;
	dfs(begin+1);
	used[begin]=0;
	dfs(begin+1);
}
int main(){
    init();
    dfs(1);
	cout<<ans;
	return 0;
}

统计分数

#include<iostream>
using namespace std;
int main(){
	int n;
	cin>>n;
	int jige=0,youxiu=0;
	for(int i=0;i<n;i++){
		int num;
		cin>>num;
		if(num>=60) jige++;
		if(num>=85) youxiu++;
	}
	cout<<jige<<" "<<youxiu<<endl;
	double jigelv=(jige*100+n/2)/n;
	double youxiulv=(youxiu*100+n/2)/n;
	/*double jigelv=jige*1.0/n*100+0.5;
	  double youxiulv=youxiu*1.0/n*100+0.5;
	**/
	cout<<(int)jigelv<<"%"<<endl;
	cout<<(int)youxiulv<<"%"<<endl;
	return 0;
}

回文日期

#include<iostream>
#include<string> 
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void run(int year){
	if((year%4==0&&year%100!=0)||year%400==0)
        months[2]=29;
		months[2]=28; 
}
int main(){
     
	int n;
    cin>>n;
    int year=n/10000;
    int month=n%10000/100;
    int day=n%100;
    
    int aimmonth=year%100%10*10+year%100/10;
    int aimday=year/100%10*10+year/1000;
    
    //测试当前年是否有满足条件的回文日期以及ab类型日期
    run(year);
	int flag=1;
	if((aimmonth>month&&aimmonth<13)||(aimmonth==month&&aimday>day&&aimday<=months[month])) {
		//检测回文日期
	    printf("%04d%02d%02d",year,aimmonth,aimday);
	    cout<<endl;
		 flag=0;
		//检测ab类型 
		if(aimmonth==aimday&&(aimmonth%10!=aimmonth/10)){
		
			printf("%04d%02d%02d",year,aimmonth,aimday);
			cout<<endl;
			return 0;
		}
	}
	//当前年没有符合条件的abab型或者基本回文日期 
    while(1){
    	year++;
    	aimmonth=year%100%10*10+year%100/10;
    	aimday=year/100%10*10+year/1000;
        run(year);
    	if(aimmonth==0||aimmonth>=13||aimday>months[aimmonth])
    	continue;
    	if(flag){
    		printf("%04d%02d%02d",year,aimmonth,aimday);
    		cout<<endl;
		    flag=0;
		}
     	if(aimmonth==aimday&&(aimmonth%10!=aimmonth/10)){
			printf("%04d%02d%02d",year,aimmonth,aimday);
			cout<<endl;
			break;
		}
	}
    
	return 0;
}

字符串值和

#include<iostream>
#include<string>
using namespace std;
int ans=0;
int alphbat[26];
string str="";
void init(){
    for(int i=0;i<26;i++)
        alphbat[i]=0;
}
void accumaulate(int begin,int end){
    init();
    for(int i=begin;i<=end;i++){
        alphbat[str[i]-'a']++;
    }
    for(int i=0;i<26;i++)
        if(alphbat[i])
            ans++;
}
int main(){
    
    cin>>str;
    int length=str.size();
    for(int i=0;i<length;i++){
        for(int j=i;j<length;j++){
            accumaulate(i,j);
        }
    }
    cout<<ans<<endl;
    return 0;
}
#include<iostream>
#include<string>
using namespace std;
long long alphbat[26];
void init(){
    for(int i=0;i<26;i++)
        alphbat[i]=0;
}
int main(){
    long long ans=0;
    init();
    string str;
    cin>>str;
    long long length=str.size();
    str="0"+str;
    for(long long i=1;i<str.size();i++){
       ans+=(i-alphbat[str[i]-'a'])*(length-i+1);
       alphbat[str[i]-'a']=i;
   }
    cout<<ans<<endl;
    return 0;
}
//借鉴别人的java代码,java这里直接long就可以通过
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        int[] nums = new int[26];
        long res = 0;//最终答案
        long n = str.length();
        str = "0"+str;
        for (int i = 1; i < str.length(); i++) {
        	//计算每一个位置字符的贡献
            res += (i - nums[str.charAt(i) - 'a']) * (n - i+1);
            //记录出现的位置,为下一次做准备
            nums[str.charAt(i) - 'a'] = i;
        }
        System.out.println(res);
    }
}

平面切分

#include<iostream>
using namespace std;
#include<set>
pair<long double,long double>p;

int coincide[1000];
long long ans=0;
long double line[1000][2];
int main(){
    int amount;
    cin>>amount;
    for(int i=0;i<amount;i++){
        cin>>line[i][0]>>line[i][1];
        set<pair<long double,long double> >points;
        for(int j=0;j<i;j++){
            if(coincide[j]) continue;//之前的线重合略过
            //比较斜率,判断重合平行
            if(line[i][0]==line[j][0]){
                if(line[i][1]==line[j][1]){
                    coincide[i]=1;
                    break;
                }
                else continue;
            }
            p.first=(line[i][1]-line[j][1])/(line[j][0]-line[i][0]);
            p.second=line[i][0]*p.first+line[i][1];
            points.insert(p);
        }
        if(!coincide[i]) ans+=points.size()+1;
    }
cout<<ans+1<<endl;
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值