COMPFEST 13 - Finals Online Mirror (Unrated, ICPC Rules, Teams Preferred)(replay)

比赛链接:

https://codeforces.com/contest/1575

A. Another Sorting Problem

题目大意:

\(n\) 个长为 \(m\) 的字符串,对它们进行排序,比较奇数位时要实现递增,偶数位要递减。

思路:

直接 sort 就好了。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, m;
struct node{
	string s;
	int p;
}nd[N];
bool cmp(node a, node b){
	for (int i = 0; i < m; i++)
		if (a.s[i] != b.s[i])
			return (a.s[i] < b.s[i]) ^ (i & 1);
}
void solve(){
	cin >> n >> m;
	for (int i = 1; i <= n; i++){
		cin >> nd[i].s;
		nd[i].p = i;
	}
	sort (nd + 1, nd + n + 1, cmp);
	for (int i = 1; i <= n; i++)
		cout << nd[i].p << " \n"[i == n];
}
int main(){
	solve();
	return 0;
}

D. Divisible by Twenty-Five

题目大意:

有一个由数字、'' 和 'X' 组成的字符串,每一个''都可以被 0 到 9 的数字替代,所有的'X'都只能被 0 到 9 的一个数字替代。求所有能组成的数字能被25整除的有几个,不能含有前导零。

思路:

能被25整除的话只用看结尾的两位就可以了,最后结尾要是00,25,50,75。
1. 可以直接去对结尾两位讨论。(我写出来的有点冗长 qwq)
2. 因为字符串长度最大只有 8 位,可以去 暴力 跑所有能组成的数,然后逐一判断。

#include <bits/stdc++.h>
using namespace std;
#define LL long long
string s;
LL expo (LL a, LL b){
	LL ret = 1;
	while (b > 0){
		if (b & 1) ret = ret * a;
		a = a * a;
		b >>= 1;
	}
	return ret;
}
int main(){
	cin >> s;
	int low = expo(10, (int)(s).size() - 1), high = expo(10, (int)(s).size()) - 1, ans = 0;  //只从可能组成数的下界遍历到上界,然后去判断
	if (low == 1) low--;
	while (low % 25) low++;
	for (; low <= high; low += 25){
		string current = to_string(low);
		char xval = '-';
		bool can = 1;
		for (int i = 0; i < (int)(s).size(); i++){
			if (s[i] == '_') continue;
			if (s[i] == 'X') {
				if (xval != '-' && xval != current[i]){
					can = 0;
					break;
				}
				xval = current[i];
			}
			else if (s[i] != current[i]){
				can = 0;
				break;
			}
		}
		ans += can;
	}
	cout << ans << "\n";
	return 0; 
}

当然,也可以用 dp 或者 dfs 去做。(后面补上)

J. Jeopardy of Dropped Balls

题目大意:

有一个 \(n * m\) 的网格,每个格子中有个数字,1、2或3,代表当球到达这个格子的时候,球会向哪边移动,1表示向右,2表示向下,3表示向左,不论格子中是什么数字,当球离开后,数字都变成2,现在在第一行放 \(k\) 个球,分别放在 \(c_1\),\(c_2\),...,\(c_k\) (1 <= \(c_i\) <= m) 的位置,判断球最后会从哪一列离开。

思路:

因为网格的大小只有1000 * 1000,所以可以直接暴力模拟跑一遍就好了。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const int NA = 1e5 + 10;
int n, m, k, a[N][N], c[NA];
int f(int x, int y){
	if (x > n) return y;
	if (a[x][y] == 1){
		a[x][y] = 2;
		return f(x, y + 1);
	}
	else if (a[x][y] == 2)
		return f(x + 1, y);
	else if (a[x][y] == 3){
		a[x][y] = 2;
		return f(x, y - 1);
	}
}
void solve(){
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			scanf("%d", &a[i][j]);
	for (int i = 1; i <= k; i++)
		scanf("%d", &c[i]);
	for (int i = 1; i <= k; i++)
		cout << f(1, c[i]) << " \n"[i == k];
}
int main(){
	solve();
	return 0;
}

G. GCD Festival

题目大意:

给一个序列 \(a\),求 \(\sum_{i = 1}^n \sum_{j = 1}^n gcd(a_i, a_j) * gcd(i, j)\),结果对 1e9 + 7 取模。

思路:

加载中...

代码:

上一篇:【优化配置】遗传算法求解风电混合储能容量优化配置问题matlab源码


下一篇:安装 redis执行make命令报错struct redisServer’没有名为‘sentinel_mode’的成员