【赛后反思】【LGR-175 Div.4】 洛谷入门赛#20 赛后反思

洛谷入门赛 #20 赛后反思

今日推歌:《水与水之歌 feat.绮萱》きくお

呆在这里直到精神恍惚为止
让我们一起快乐地玩耍

我们术术人有自己的《让我们荡起双桨》(大雾


Before

先看结果(是同步赛的成绩,因为前一天晚上我在死磕dfs):

image

省流:
暴力-纯度75%
STL-纯度25%

展开目录


A.射箭

参考上次的做法,先排序,然后把最小的两个相加,看第三人是否大于这个和

#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
int x[3]; 
int main() {
	scanf("%d%d%d", x + 0, x + 1, x + 2);
	sort(x, x + 3);
	if(x[2] > (x[1] + x[0])) puts("1");
	else puts("0");
	return 0;
}

B.酒

三个李白一台戏

考虑把每个李白喝的酒都加起来,然后进行比较,找出喝酒最多的那个。因为只有三个李白甚至可以直接写裸的 if.

#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
double x, y, a[7];
int main() {
	for(int i = 1; i <= 5; ++i) scanf("%lf", a + i);
	scanf("%lf%lf", &x, &y);
	double j = a[1] * x + a[2] * y, q = a[3] * y, k = a[4] * y + a[5];
	if(j >= q && j >= k) printf("1 %.2lf\n", j);
	if(q > j && q >= k) printf("2 %.2lf\n", q);
	if(k > j && k > q) printf("3 %.2lf\n", k);
	return 0;
}

EXTRA

image

image


C.分配工资

先求出分母 \(c\),也就是所有的工资权重之和;再求出分子 \(d\),把卷王所负责的题目工资权重加到一起,最后输出 \(m\cdot\dfrac{d}{c}\).

#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e6 + 5;
int n, m, a[N], b[N], c, d;
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i) scanf("%d%d", a + i, b + i), c += b[i];
	for(int i = 1; i <= n; ++i) if(a[i] == 1) d += b[i];
	printf("%.3lf\n", m * 1.0 / c * d);
	return 0;
}

D.三位数

因为数据范围很小,所以可以直接暴力枚举每一位进行判断。

#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
int d, fl;
int main() {
	scanf("%d", &d);
	for(int i = 1; i <= 9; ++i) 
		for(int j = 0; j <= 9; ++j) 
			for(int k = 0; k <= 9; ++k) 
				if(!((i * 10 + j) % d) && !((j * 10 + k) % d) && !((i * 100 + j * 10 + k) % d)) 
					printf("%d%d%d\n", i, j, k), fl = 1;
	if(!fl) puts("None!");
	return 0;
}

压行真的很丑


E.数字串

image

65pts Solution

找到两个 \(1\) 中间 \(0\) 连续出现最多的次数,之后只要扫到了 \(0\) 的连续出现次数不等于这个次数就输出 No.

#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
int T, n, m, sum, maxs, ss, fl;
string s;
int main() {
	scanf("%d" , &T);
	while(T--) {
		scanf("%d%d", &n, &m);
		cin >> s;
		for(int i = s.find("1") + 1; ; ++i) {
			if(s[i] == '0') ++maxs;
			else break;
		}
		for(int i = 0; i < s.size(); ++i) {
			if(s[i] == '0') ++sum;
			if(sum > maxs || sum > n) {puts("No"); fl = 1; break; }
			if(s[i] == '1') {
				if(ss != 0 && sum < maxs) {puts("No"); fl = 1; break; }
				sum = 0, ++ss;
			}
		}
		if(!fl) puts("Yes");
		sum = maxs = fl = ss = 0;
	}
	return 0;
}

F.小朋友的身高

个人感觉比 \(E\)\(G\) 简单。

预处理一个二维数组 \(A\): \(A_{i,j}\) 代表第 \(i\) 个小朋友在第 \(j\) 年的身高,按照题意输出 \(A_{y,x} - A_{z, x}\) 即可。

警钟长鸣:弄清楚自己两维分别代表的是什么,我就弄混好几次(目移

#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e3 + 5;
ll n, m, q, a[N][N], b, x, y, z;
int main() {
	scanf("%lld%lld%lld", &n, &m, &q);
	for(int i = 1; i <= n; ++i) scanf("%lld", &a[i][0]);
	for(int i = 1; i <= m; ++i) {
		for(int j = 1; j <= n; ++j) {
			a[j][i] = a[j][i - 1];
			scanf("%lld", &b);
			a[j][i] += b;
		}
	}
	while(q--) {
		scanf("%lld%lld%lld", &x, &y, &z);
		printf("%lld\n", a[y][x] - a[z][x]);
	}
	return 0;
}

G.翻转和反转

image

50pts Solution

比较优化一点的暴力,但是仍然 \(50pts\).翻转用了 swap,反转则是异或 \(1\).(因为 0 ^ 1 = 1,1 ^ 1 = 0,相当于反转)

代码夹带私货严重:

#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
inline string intp(string s) {
//	cerr << "春风漫草野\n"; 
	for(int i = 0; i < s.size() / 2; ++i) swap(s[i], s[s.size() - i - 1]); 
	return s;
}
inline string istp(string s) {
//	cerr << "三月的天\n"; 
	for(int i = 0; i < s.size(); ++i) s[i] = '0' + ((s[i] - '0') ^ 1);
//	cerr << "千里外不曾相见\n"; 
	return s;
}
int n, q;
string a, b;
int main() {
	scanf("%d%d", &n, &q);
	cin >> a >> b;
//	cout << a << endl;
	for(int i = 0; i < q; ++i) {
//		cerr << "白马过了离原\n";
		if(b[i] == '1') a = intp(a);
		if(b[i] == '2') a = istp(a);
//		cerr << "仰头看纸鸢\n" << a << endl; 
	}
	cout << a << endl;
	return 0;
}

H.陨石

一眼 DP,都怪 K8He(确信

其实是道贪心,从损坏程度最小的开始修,这样一定能修最多。

\(E\)\(G\) 简单。

#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e6 + 5;
int T, n, t, m, a[N], x, ans;
int main() {
	scanf("%d", &T);
	while(T--) {
		scanf("%d%d%d", &n, &t, &m);
		for(int i = 1; i <= n; ++i) scanf("%d", a + i);
		for(int i = 1; i <= m; ++i) scanf("%d", &x), a[x] -= 2;
		sort(a + 1, a + 1 + n, greater<int>());
		for(int i = 1; i <= n; ++i) {
			while(a[i] <= 0) --t, ++a[i];
			if(t >= 0) ++ans;
			else break;
		}
		printf("%d\n", ans);
		ans = 0;
	}
	return 0;
}

After

又被入门赛 AK 了。

posted @ 2024-02-17 21:51  _Kiichi  阅读(46)  评论(3编辑  收藏  举报