传智杯第五届题解

B.莲子的机械动力学

分析:这题有个小坑,如果是0+0 = 0,结果记得要输出0。

得到的教训是,避免前导0出现时,要注意答案为0的情况。否则有可能会没有输出

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#include
#include
#include
#include 
#include
#include 

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
//2147483647

#define int long long
//#include 
typedef long long ll;
#include
using namespace std;

const int N = 1e6 + 10;
long long MAX(long long a, long long b) { return a < b ? b : a; }
long long MIN(long long a, long long b) { return a < b ? a : b; }
int qmi(int a, int k, int p) {
	int res = 1;
	while (k) {
		//后面的a其实是底数与其指数的运算结果了,是不断迭代的
		//第一个a其实就是a的2的0次方
		if (k & 1) res = (res * a) % p;

		a = (a * a) % p;
		//注意,a是一个不断变化的过程
		//下一个a就等于上一个a的平方,
		
		k >>= 1;
	}
	return res;
}
int C(int a, int b,int p) {
	int ans = 1;
	int j = a;
	for (int i = 1; i <= b; i++,j--) {
		ans = ans * j % p;
		ans = ans * qmi(i, p - 2, p) % p;
	}
	return ans;
}
int lucas(int a, int b,int p) {
	if (a < p && b < p) {
		return C(a, b, p);
	}
	return C(a % p, b % p, p) * lucas(a / p, b / p, p) % p;

}


//16:33
int a[N], b[N], c[N];
signed main() {
	int n, m; cin >> n >> m;
	for (int i = n; i >= 1; i--) cin >> a[i];
	for (int i = m; i >= 1; i--) cin >> b[i];

	
	//想要a存的是位数比较多的数
	if (n < m) {
		swap(a, b);
		swap(n, m);
	}

	for (int i = 1; i <= n; i++) {
		c[i] += a[i] + b[i];
		int k = i + 1;
		int add = c[i] / k;
		c[i] %= k;
		c[i + 1] += add;
	}

	int f = 0;
	bool isPrint = false;
	for (int i = N; i >= 1; i--) {
		if (c[i] != 0) f = 1;
		if (f) {
			if (i != 1) cout << c[i] << " ";
			else cout << c[i];
			isPrint = true;
		}
	}
	if (!isPrint) cout << 0;
	return 0;
}

C-莲子的排版设计学

分析:关键是对于行号的处理,要打印多少空格

#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#include
#include
#include
#include 
#include
#include 

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#define int long long
//#include 
typedef long long ll;
#include
using namespace std;

const int N = 1e4 + 10;
//long long MAX(long long a, long long b) { return a < b ? b : a; }

vector ans;
int num;
int j = 10;
void PrintBlank() {
	for (int i = 0; i < num; i++) cout << " ";
}
signed main() {   
    //IOS;
	string s;
	int cnt = 0;
	while (getline(cin,s)) {
		ans.push_back(s);
		//getchar();
		
	}

	
	int n = ans.size();
	int k = 10;
	while (n>=0) {
		
		n -= k;
		k *= 10;
		if (n>=0) num++;
	}

	for (int i = 0; i < ans.size(); i++) {
		cnt++;
		if (i + 1 == j) {
			//进位了,就减少一次空格的打印
			num--;
			j *= 10;
		}
		PrintBlank();

		cout << cnt << " ";
		puts(ans[i].c_str());
	}

	return 0;
}

D-莲子的物理热力学

分析:

难想的点就在于,想不到可以假设一个[l,r]的区间,这个有点像二分的思想。

第二个难点在于,要想到操作次数是u+v+min(u,v)。但这个通过模拟样例,多少可以获得一点灵感。

教训:看到“极差”,这类字眼,就要想想看二分了。二分就是枚举假设mid是否成立。这题虽然不是二分,但思想和二分很像。

传智杯第五届题解_第1张图片

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#include
#include
#include
#include 
#include
#include 

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
#define int long long
//#include 
typedef long long ll;
#include
using namespace std;

const int N = 1e6 + 10;
//long long MAX(long long a, long long b) { return a < b ? b : a; }

int a[N];
signed main() {   
    //IOS;
	int n, m; cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	sort(a + 1, a + 1 + n);
	

	int j = 1;
	int ans = 2147483647;
	for (int i = 1; i <= min(n, m + 1); i++) {
		j = max(j, i);
		while ((i - 1) + (n - j) + min(i - 1, n - j) > m) j++;
		ans = min(ans, a[j] - a[i]);

	}
	cout << ans;

	return 0;
}

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