第十二届蓝桥杯(省赛)(C/C++大学B组)

A.空间

第十二届蓝桥杯(省赛)(C/C++大学B组)_第1张图片

256 * 1024 * 1024 * 8 / 32 = 67108864

B.卡片

第十二届蓝桥杯(省赛)(C/C++大学B组)_第2张图片

#include
#include
#include
#include
#define mp make_pair
#include
#include
#include 
#include
using namespace std;
#define ll long long
int a[10]; 
bool w()
{
     
	for(int i=0;i<10;i++)
	{
     
		if(a[i]==2021)
		{
     
			return 1;
		}
	}
	return 0;
}
void c(int k)
{
     
	while(k)
	{
     
		a[k%10]++;
		k/=10;
	}
}
int main()
{
      
	for(int i=1;;i++)
	{
     
		c(i);
		if(w()==1)
		{
     
			cout<<i<<endl;
			return 0;
		}
	}
	return 0;
}
//3181

C.直线

第十二届蓝桥杯(省赛)(C/C++大学B组)_第3张图片

#include 
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
#define scd(n) scanf("%d",&n)
#define prd(n) printf("%d",n)
using namespace std;
typedef long long ll;
const int N=1e6+5;
pair<double,double>pi[N];
int cot;
int main() {
     
    int x=20,y=21;
    for(int i=0;i<x;i++){
     
        for(int j=0;j<y;j++){
     

            for(int k=0;k<x;k++){
     
                for(int m=0;m<y;m++){
     
                    int x1=i,y1=j,x2=k,y2=m;
                    if(x2-x1==0)continue;
                    double kk=(double)(y2-y1)/(x2-x1);
                    double b=y2-kk*x2;
                    pi[cot++]=make_pair(kk,b);
                }
            }
        }
    }
    int res=1;//假设以k来找k={1,1,2,3,3,5}=1,2,3,5所以一开始res=1
    sort(pi,pi+cot);
    for(int i=1;i<cot;i++){
     
        if(fabs(pi[i].first-pi[i-1].first)>1e-8||fabs(pi[i].second-pi[i-1].second)>1e-8)
        res++;
    }
    cout<<res+x<<'\n';
    return 0;
}

D.货物摆放

第十二届蓝桥杯(省赛)(C/C++大学B组)_第4张图片

#include 
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
#define scd(n) scanf("%d",&n)
#define prd(n) printf("%d",n)
using namespace std;
typedef long long ll;
void solve()
{
     
    int t;
    cin>>t;
    while(t--){
     

    }
}
int cot;
int main() {
     
    ll n=2021041820210418;
    vector<ll>v;
    for(ll i=1;i*i<=n;i++){
     
        if(n%i==0){
     
            v.push_back(i);
            if(n/i!=i)v.push_back(n/i);
        }
    }
    int res=0;
    for(auto a:v){
     
        for(auto b:v){
     
            for(auto c:v){
     
                if(a*b*c==n)res++;
            }
        }
    }
    cout<<res<<'\n';
    // for(auto it:v){
     
    //     cout<
    // }
    return 0;
}

E.路径

第十二届蓝桥杯(省赛)(C/C++大学B组)_第5张图片

#include 
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
#define scd(n) scanf("%d",&n)
#define prd(n) printf("%d",n)
using namespace std;
typedef long long ll;
const int N=1e5+5;
int gcd(int a,int b)
{
     
    return b==0?a:gcd(b,a%b);
}
struct node{
     
    int u,v,w;
};
vector<node>e;
int dis[2025];
void init()
{
     
    for(int i=1;i<=2021;i++){
     
        for(int j=i+1;j<=2021;j++){
     
            if(abs(i-j)<=21){
     
                e.push_back({
     i,j,i*j/gcd(i,j)});
                e.push_back({
     j,i,i*j/gcd(i,j)});
            }
        }
    }
    cout<<e.size()<<'\n';
}
void BF(int n)
{
     
    for(int i=1;i<=n;i++)dis[i]=0x3f3f3f3f;
    dis[1]=0;
    for(int i=1;i<=n-1;i++){
     
        for(int j=0;j<e.size();j++){
     
            int u=e[j].u,v=e[j].v,w=e[j].w;
            if(dis[v]>dis[u]+w){
     
                dis[v]=dis[u]+w;
            }
        }
    }
    cout<<dis[2021]<<'\n';
}
void solve()
{
     
    int t;
    cin>>t;
    while(t--){
     

    }
}
int main() {
     
    // solve();//10266837
    init();
    BF(2021);
    return 0;
}

F.时间显示

第十二届蓝桥杯(省赛)(C/C++大学B组)_第6张图片

#include

using namespace std;

int main(){
     
	int hh, mm, ss;
    long long int n;
    cin>>n;
    // 因为不需要考虑毫秒,所以直接舍去
    n /= 1000;
    hh = (n/(60*60)) % 24;
    n -= n/(60*60) * (60*60);
    mm = (n/60) % 12;
    n -= n/60 * 60;
    ss = n % 60;
    printf("%02d:%02d:%02d", hh, mm, ss);
    return 0;
}

G.砝码称重

第十二届蓝桥杯(省赛)(C/C++大学B组)_第7张图片

#include

using namespace std;

unordered_set<int> se;
int n, a[100000];

void dfs(int index, int val){
     
	if(index < 0) return;
	if(val > 0) se.insert(val);
	// 一步一步往下
	dfs(index-1, val - a[index-1]);
	dfs(index-1, val + a[index-1]);
	// 隔级隔级往下
	for(int i=2;i<index+1;i++){
     
		dfs(index-i, val + a[index-i]);
	}
}

int main(){
     
	cin>>n;
	for(int i=0; i<n; i++) cin>>a[i];
	sort(a, a+n);
	for(int i=0;i<n;i++){
     
		dfs(i, a[i]);
	}
	// 输出检验
//	unordered_set::iterator si;
//	for(si=se.begin();si!=se.end();si++){
     
//		cout<<*si<<" ";
//	}
//	cout<
	cout<<se.size()<<endl;
	return 0;
}


H.杨辉三角形

第十二届蓝桥杯(省赛)(C/C++大学B组)_第8张图片

#include 

using namespace std;
// N是一个个试的,然后发现20000够了,太大超内存,大小找不到最大的数
const int N = 20000;
int a[N][N];

int main(){
     
	int n, s = 0;
    cin>>n;
    if(n==1){
     
    	cout<<1<<endl;
    	return 0;
	}
    for(int i=1; i<N;i++){
     
    	for(int j=1; j<=i; j++){
     
			s++; // 每数一个数就加一
    		if(j == 1 || i==j){
     
    			a[i][j] = 1;
    			continue;
			}
			a[i][j] = a[i-1][j] + a[i-1][j-1];
			if(a[i][j] == n){
     
				cout<<s<<endl;
				return 0;
			}
		}
	}
    return 0;
}

I.双向排序

第十二届蓝桥杯(省赛)(C/C++大学B组)_第9张图片

#include

using namespace std;

int main(){
     
    int a[100001],n,m,q,p;
    cin>>n>>m;
	// 初始化数组
	for(int i=1;i<=n;i++) a[i]=i;
    while(m--){
     
        cin>>p>>q;
        if(p==0) sort(a+1, a+q+1, greater<int>());
        else if(p == 1) sort(a+q,a+n+1);
    }
    for(int i=1; i<=n; i++){
     
	    cout<<a[i];
        if(i != n) cout<<" ";
    }
    return 0;
}

J.括号序列

第十二届蓝桥杯(省赛)(C/C++大学B组)_第10张图片

#include

using namespace std;

int sum = 0;

void iter(int l, int r, int n){
     
    if(l + r == 2*n) {
     
        sum++;
        return;
    }
    if(l < n) iter(l+1, r, n);
    if(r < l) iter(l, r+1, n);
}

int main(){
     
	string s;
	getline(cin, s);
	int l = 0, r = 0, n;
	for(int i=0;i<s.size();i++){
     
		s[i]==')'? r+=1: l+=1;
	}
	n = max(l, r);
	iter(0, 0, n);
	cout<<sum<<endl;
	return 0;
}

你可能感兴趣的:(算法)