蓝桥杯里面很多时候对于数字的精度很有要求,比如最后两题,他对于交点可能产生小数点,所以需要他的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;
}