蓝桥杯第十二届省赛题解

蓝桥杯第十二届省赛题解_第1张图片
赛后才知道计算公式是256乘1024乘1024乘8除以32,泪崩==蓝桥杯第十二届省赛题解_第2张图片

#include
using namespace std;
int num[10];
bool check(int n)
{
	while(n>0)
	{
		if(num[n%10]==0)
		return false;
		num[n%10]--;
		n/=10;
	}
	return true;
}
int main()
{
	fill(num,num+10,2021);
	for(int i=1;1;i++)
	{
		if(!check(i))
		{
			cout<<i-1<<endl;
			return 0;
		}
	}
	return 0;
 } 

答案注意减1,泪崩
蓝桥杯第十二届省赛题解_第3张图片
比赛时把直线公式的kx+b的k和b存进去了,然而非常不友好的浮点数,呜呜呜,待补题
蓝桥杯第十二届省赛题解_第4张图片
弱者不配说话,只配注释

#include
using namespace std;
long long num=2021041820210418;
long long yin[100000005];
int cnt=0;
int main()
{
	int j=0;
	for(long long i=1;i<=sqrt(num);i++)
	{
		if(num%i==0)
		{
			yin[j++]=i;
			yin[j++]=num/i;					//注意这一步,比赛时没注意到,我是弱者 
		}
	}
	for(int i=0;i<j;i++)
	for(int n1=0;n1<j;n1++)
	for(int n2=0;n2<j;n2++)					//易看出,长宽高肯定是因子之间的相乘,因子只有128个,3重循环就很简单了 
	{
		if(yin[i]*yin[n1]*yin[n2]==num)
		{
			cnt++;
		}
	}
	cout<<cnt<<endl;
 } 

蓝桥杯第十二届省赛题解_第5张图片

#include
#define INF 2147483647
using namespace std;

const int maxn = 1e4 + 5;
const int inf = 0x3f3f3f3f;
bool vis[maxn];
int dis[maxn];
int c1, c2;

struct node {
	int u, w;										//u为起始点,w为值,以vector数组的下标作为起始点 
	node(int x, int y):u(x), w(y) {}
	bool operator < (const node& r)const			//运算符重置,用来让优先队列按w的值从小到大往下排 
	{
		return w > r.w;
	}
};

vector<node>e[maxn];

void add_edge(int u, int v, int w)
{
	e[u].push_back(node(v, w));
}

void dij(int st)									//st为起始点 ,最短路模板 
{
	fill(vis, vis + maxn, false);					//fill函数类似于memset,但是memset是用来设置ascii码的 
	fill(dis, dis + maxn, inf);
	priority_queue<node>pque;
	dis[st] = 0;
	pque.push(node(st, 0));
	while (!pque.empty())
	{
		node t = pque.top();
		pque.pop();
		int u = t.u;
		if (vis[u])
			continue;
		vis[u] = true;
		for (int i = 0; i < e[u].size(); i++)
		{
			int v = e[u][i].u;						//每次将最小边压进优先队列中 
			int w = e[u][i].w;
			if (!vis[v] && dis[v] > dis[u] + w)
			{
				dis[v] = dis[u] + w;
				pque.push(node(v, dis[v]));
			}
		}
	}
}

int main()
{
	for (int i = 1; i < 2021; i++)
	for(int j = i+1; j-i <= 21&&j<=2021 ; j++)
	{
		add_edge(i , j , i/__gcd(i,j)*j);			//最小公倍数的计算公式 
		add_edge(j , i , i/__gcd(i,j)*j); 
	}
	dij(1);
	cout<<dis[2021]<<endl;
}

你可能感兴趣的:(蓝桥杯第十二届省赛题解)