十二届蓝桥杯省赛

题目链接

空间

67,108,864

卡片

#include<iostream>
using namespace std;
int main(){
	int ans=0,flag=1;
	int t;
	int a[10];
	for(int i=0;i<=9;i++){
		a[i]=2021;
	}
	for(int n=1;flag==1;n++){
		t=n;
		while(t!=0){
			a[t%10]--;
			if(a[t%10]<0){
				flag=0;
				break;
			}
			t/=10;
		}
		ans=n;
	}
	cout<<ans-1;
}

3181

直线

  • 数组的定义要写到main函数的外面,因为main函数内部是栈区,内存是比较小的,函数外部是数据区,内存是比较大的。

这题让我在考场可能不一定写的出来,有一个精度处理的问题,这次学到了。

#include <iostream>
#include <cstring>
#include <algorithm>
#include "cmath"
using namespace std;
pair<double,double>l[200000];
int main(){
	int n=0;
	for(int x1=0;x1<=19;x1++){
		for(int y1=0;y1<=20;y1++){
			for(int x2=0;x2<=19;x2++){
				for(int y2=0;y2<=20;y2++){
					if(x1!=x2){
						double k=double((y2-y1))/double((x2-x1));
					    double b=y1-k*x1;
					    l[n++]={k,b};
					}
				}
			}
		}
	}
	//精度处理 
	sort(l,l+n);
	int ans=1;
	for(int i=1;i<n;i++){
		if(fabs(l[i].first-l[i-1].first>1e-8)||fabs(l[i].second-l[i-1].second)>1e-8){
			ans++;
	    }
	} 
	cout<<ans+20;//加上斜率不存在的20条线 
	return 0;
}

货物摆放

  • 注意数字过大要开long long
    首先找出大数的所有因数,然后暴力。
#include<iostream>
using namespace std;
long long n=2021041820210418;
long long d[100000];
int main(){
	int ans=0;
	long long x=0;
	for(long long i=1;i*i<=n;i++){
		if(n%i==0){
			d[x++]=i;
			if(i*i!=n){
				d[x++]=n/i;
			}
		}
	}
	for(long long i=0;i<=x;i++){
		for(long long j=0;j<=x;j++){
			for(long long k=0;k<=x;k++){
				if (d[i]*d[j]*d[k]==n){
					ans++;
				}
			}
		}
	}
	cout<<ans;
	return 0;
} 

路径

一开始把最小公倍数算法写错了导致算错,用dp写的,不算很难。

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int n,int m){
	return m==0?n:gcd(m,n%m);
}
int lcm(int n,int m){
	return n*m/gcd(n,m);
}
#define N 2021
#define INT_MAX 2147483647
int dp[N+5]; 
int i,t,m;
int main(){
	dp[1]=0;
    dp[2]=2;
	for(i=3;i<=N;i++){
		m=INT_MAX;
		t=i-1;
		while(t>0&&(i-t)<=21){
			m=min(dp[t]+lcm(i,t),m);
			t--;
		}
		dp[i]=m;
	}
	cout<<dp[N];
}
//10266837

时间显示

犯的几点错误

  • 复制到提交时太急了,头文件没复制进去
  • 1秒是1000毫秒,常识记不住
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
	int m,h,min,sec;
	long long n;
	cin>>n; 
	n/=1000;
	n=n%(3600*24);
	sec=n%60;
	n-=sec;
	n/=60;
	min=n%60;
	n-=min;
	n/=60;
	h=n; 
	if(h<10)cout<<0;
	cout<<n<<":";
	if(min<10)cout<<0;
	cout<<min<<":";
	if(sec<10)cout<<0;
	cout<<sec;
	return 0;
	//1618708103123
}

砝码称重

很有意思的一道题目
可以像背包问题一样考虑,每新增一个砝码

  • 砝码自身
  • 与前一状态的每种相加
  • 与前一状态的每种相减取绝对值
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
int main(){
	int n,x1,x2;
	scanf("%d",&n);
	vector<int>w(n);
	for(int i=0;i<n;i++){
		scanf("%d",&w[i]);
	}
	set<int>s,s1;
	s.insert(w[0]);
	for(int i=1;i<n;i++){
		s1.insert(w[i]);
		for(auto it=s.begin();it!=s.end();it++){
			x1=abs(w[i]-*it);
			x2=abs(w[i]+*it);
			if(x1>0){
				s1.insert(x1);
			}
			if(x2>0){
				s1.insert(x2);
			}
		}
		for(auto it=s1.begin();it!=s1.end();it++){
			s.insert(*it);
		}
		s1.clear();
	}
	cout<<s.size();
}

杨辉三角

空间超了,这个程序十个能过4个

  • vector<vector<int> >a;要有空格隔开,不然会报编译错误直接寄
#include<iostream>
#include<vector>
using namespace std;
int n=0;
vector<vector<int> >a;
int main(){
	int N,ans;
	int flag=1;
	cin>>N;
	while(flag){
		if(N==1){
			ans=1;
			break;
		}
		vector<int>b;
		for(int i=0;i<=n;i++){
			if(i==0||i==n)b.push_back(1);
			else b.push_back(a[1][i-1]+a[1][i]);
			if(b[i]==N){
				ans=n*(n+1)/2+i+1;
				flag=0;
				break;
			}
		}
		if(a.size()==2){
			a.erase(a.begin());
		}
		a.push_back(b);
		n++;
	}
	cout<<ans;
	return 0;
}
/*
		for(int i=0;i<=n;i++){
			cout<<b[i]<<" ";
		}
		cout<<endl;*/

双向排序

需要用到自定义排序方式
这题因为看错题目卡了很久

#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
	return a>b;
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	vector<int>a(n);
	for(int i=0;i<n;i++){
		a[i]=i+1;
	}
	vector<vector<int> >d(m,vector<int>(2));
	for(int i=0;i<m;i++){
		scanf("%d%d",&d[i][0],&d[i][1]);
	}
	for(int i=0;i<m;i++){
		if(d[i][0]==0){
			sort(a.begin(),a.begin()+d[i][1],cmp);
		}
		else{
			sort(a.begin()+d[i][1]-1,a.end());
		}
	}
    for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	return 0;
}
/*
3 3
0 3
1 2
0 2
*/

括号序列

难,摆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值