【已补完】【解题报告】【比赛复现】洛谷入门赛#18

洛谷入门赛 #18 题解

今日推歌:《Love it?》LOLUET

很伟大的唱法,建议都去听听(雾

Before

image

展开目录


A 灵活控分

image

\(\displaystyle\left(\frac{a}{10}\right)^2\),向上取整

AC代码

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
double a;
int main() {
	scanf("%lf", &a);
	printf("%.lf", ceil((a / 10.0) * (a / 10.0)));
	return 0;
}

After

image


B 禁止在 int 乘 int 时不开 long long

如题,需要开 long long,直接最小和最小相乘判是否小于下界、最大和最大相乘判是否大于上界即可。

AC代码

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
const ll inf = 2147483648;
ll a, b, c, d;
int main() {
	scanf("%d%d%d%d", &a, &b, &c, &d);
	if(a * c < -inf || b * d >= inf) puts("long long int");
	else puts("int");
	return 0;
}

After

image


C NK

首先这题开 pow 会 TLE,其次这题步长为 1 也会 TLE.而我两个都占(

提前算好 \(N^N\),因为要求个位是 \(N\),所以显然从 \(N\) 开始循环,每次步长为 \(10\) 就能跳过所有各位不是 \(N\) 的数。

AC代码

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

After

image


D 异或构造题?

因为一个数异或它自己一定是 \(0\),所以只需要输出 \(a\) 数组的异或和即可。

AC代码

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e6 + 5;
ll n, a, nn;
int main() {
	scanf("%lld", &n);
	for(int i = 1; i <= n; ++i) {
		scanf("%lld", &a);
		// scanf 没加 & 就是说的这个,因为后来我意识到可以把数组简化成一个变量,但是把 a + i 改成 a 了没加 &.
		if(i == 1) nn = a;
		else nn = (nn ^ a);
	}
	printf("%lld 0\n", nn);
	return 0;
}

E 颜料覆盖

用前缀和(仮)处理出到一层颜料为止的非 \(0\) 颜料数,然后记录最大的颜料的下标,最后输出的是这个下标

一个区域看作一组数据单独求解。

AC代码

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e6 + 5;
int n, m, a[N], sum[N];
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i) {
		int maxa = 0, maxi = 0;
		for(int j = 1; j <= m; ++j) {
			scanf("%d", a + j), sum[j] = sum[j - 1];
			if(a[j]) ++sum[j];
			if(a[j] > maxa) maxa = a[j], maxi = j;
		}
		printf("%d %d\n", maxi, sum[maxi - 1]);
		// 多测要换行。
	}
	return 0;
}

F 函数零点

按照题意模拟。注意当这个点是 0 的时候这个点就是零点。

AC代码

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
ll n, a[N], ans;
int main() {
	scanf("%lld", &n);
	for(int i = 0; i <= n; ++i) {
		scanf("%lld", a + i);
		if(a[i] * a[i - 1] < 0) ++ans;
		if(!(a[i])) ++ans;
	}
	printf("%lld\n", ans);
	return 0;
}

After

image


G 铅球杯

用 map 映射 {变量名} 和对应的值,当搜到 { 时输出对应值,并跳到 } 出现的位置。

注意的是这里使用 string.find() 需要传从哪个位置开始搜,不然就会一直在第一个位置转。

AC代码

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
int n, k, b;
string a, c;
map<string, int> mp;
int main() {
//	freopen("cup.in", "r", stdin);
	cin >> n >> k;
	for(int i = 1; i <= n; ++i) {
		cin >> a >> b;
		mp.insert(make_pair("{" + a + "}", b));
	} 
	getchar();
	for(int i = 1; i <= k; ++i) {
		getline(cin, c);
		for(int j = 0; j < c.size(); ++j) {
				int x = c.find('}', j);
				cout << mp.find(c.substr(j, x - j + 1)) -> second;
				j = x;
			} else cout << c[j];
		}
		putchar('\n');
	}
	return 0;
}

After

image

image

image

image

image

结语

(啊?还有一道?不知道,不认识,没听过。

image

posted @ 2024-02-19 10:25  _Kiichi  阅读(42)  评论(13编辑  收藏  举报