acwing第十二届蓝桥杯B组真题

73 阅读3分钟

image.png

解析:把256MB换算为字节单位:256/1024/1024,然后再算

	cout << 256 * 1024 * 1024 / 4 << endl;

image.png 当输入11的时候三个1已经用完了 1,2,3,4,5,,,,,7,8,9,10,11
所以此时只能输出10,也就是输出11-1

  1. 初始化一个数组s,其索引从0到9,每个元素的值都是2021。这表示你有2021个0,2021个1,依此类推,直到你有2021个9。
  2. 在无限循环中,从数字1开始检查每一个数字,看它是否可以被表示为数组s中数字的组合。这是通过check函数来完成的。
  3. check函数通过取模运算和整数除法来逐个检查数字的每一位。每个数都取个位数,如果个位数-1<0,说明不够减,返回false
  4. 如果找到一个数字不能被表示,就输出前一个数字并退出程序。


int s[10];

bool check(int x) {
	while (x) {
		int t = x % 10;
		x /= 10;
		if (--s[t] < 0)
			return false;
	}

	return true;
}



int main() {

	for (int i = 0; i < 10; i++) {
		s[i] = 2021;
	}
	for (int i = 1;; i++) {
		if (!check(i)) {
			cout << i - 1 << endl;
			return 0;
		}
	}

	return 0;
}

image.png

暂停

image.png

解析: image.png 把n的所有因数全部,枚举出来,放到一个vector里面, 然后用三个for循环把所有情况列举出来, 如果是一种方案,计数器就加1:



typedef long long ll;

int main() {


	vector<ll> d;
	ll n = 0;
	cin >> n;
	for (ll i = 1; i * i <= n; i++)
		if (n % i == 0) {
			d.push_back( i);
			if (n / i != i)
				d.push_back(n / i);
		}



	ll count = 0;

	for (auto a : d)
		for (auto b : d)
			for (auto c : d)
				if (a * b * c == n)
					count++;



	cout << count << endl;

	return 0;
}

结果:2430

image.png

编程题

3416. 时间显示 - AcWing题库

读取时间n, 将n除以1000以去掉毫秒部分,然后取n除以86400的余数以得到最后一天的时间。然后将余数除以3600得到小时数,再将余数除以60得到分钟数,最后取余数得到秒数

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
    ll n;
    cin>>n;
    n/=1000;//去掉毫秒
    
    n%=86400;//24*60*60就是一天的秒数86400    n%=86400就得到最后一天的秒数
    
    int h=n/3600;//最后一天除以3600秒的带剩余的小时数
    
    n%=3600;//小时的余数也就是分钟和秒,除以60得到分钟,余数是秒
    
    int m=n/60;//最后的分钟数
    
    int second=n%60; //最后的秒数
    
    printf("%02d:%02d:%02d\n",h,m,second);
    
return 0;
}

3418. 杨辉三角形 - AcWing题库 N最大为:10的9次方,所以这道题不能暴力解。

image.png

这道题一定有解: image.png 我们可以看出来杨辉三角是左右堆成的:

image.png 因为题目要求我们求第一次出现的数:

image.png

所以这个数一定是在左半部分,我们只看左半部分就行了:

image.png

我们斜着看,发现每个斜行都是呈递增状态:

image.png

组合数越靠近中间值越大,所以我们要找N要从内往外找:

image.png 我们发现 1<6<15<16,也就是越往内部这个数越有可能是N.

image.png

所以枚举的时候从第16行开始,枚举。