A - Rigged!
题目描述
有n
个运动员参加举重比赛,第i
个运动员的力气为 s i s_i si,耐力为 e i e_i ei,你的朋友小明是第一名运动员,你非常希望小明能够获胜。现在,你可以选择一个杠铃的重量为w
,让这n
个运动员进行举重,如果第i
个运动员的 s i s_i si会严格大于w
,那么他可以举起这个杠铃 e i e_i ei秒,最终举起杠铃时间久者获胜,如果时间相同则没有胜者。现在需要你求出那个w
值,如果任意的w值都无法让小明获胜,输出-1
,否则输出w
。
思路:贪心+模拟
- 贪心的让这个
w
最大,最大为 s 1 − 1 s_1 - 1 s1−1,那么看其他n-1
个运动员的力气 s i s_i si是否有大于等于w
且耐力会大于等于 e 1 e_1 e1的,如果存在,那么答案为-1,否则就是 s 1 − 1 s_1-1 s1−1。
public static void solve() throws IOException {
int n = readInt();
Pair[] pairs = new Pair[n + 1];
Arrays.setAll(pairs, g-> new Pair());
for (int i = 1; i <= n; i++) {
pairs[i] = new Pair(readInt(), readInt());
}
boolean f = false;
int p = pairs[1].first , q = pairs[1].second;
for (int i = 2; i <= n; i++) {
if (pairs[i].first >= p && pairs[i].second >= q) {
f = true;
}
}
printWriter.println(f ? "-1" : p);
}
B - Chips on the Board
题目描述
你有一个 n ∗ n n * n n∗n的棋盘,上面没有任何棋子,现在又给你两个长度为n
的正整数数组a
和b
,其中a
中的数 a i a_i ai只能放在棋盘的第i
行作为棋子,b
中的数 b i b_i bi只能放在棋盘的第i
列作为棋子,现在这个棋盘需要满足每一行或者每一列至少有一个棋子,求所有棋子的值之和最小为多少。
思路:贪心+模拟
- 求出数组
a
和数组b
的最小值。- 枚举每一行都有棋子或者每一列都有棋子,取最小值。
mina
用来与每一列组合,minb
用来与每一行组合。- 这题和 2023icpc网络预选赛第二场的D题有点类似。
public static void solve() throws IOException {
int n = readInt();
int[] a = utils.nextIntArray(n), b = utils.nextIntArray(n);
int mina = utils.forceInt(1e9) + 10, minb = utils.forceInt(1e9) + 10;
for (int i = 1; i <= n; i++) {
mina = Math.min(mina, a[i]);
minb = Math.min(minb, b[i]);
}
long suma = 0, sumb = 0;
for (int i = 1; i <= n; i++) {
suma += 1l * a[i] + minb;// 每一行都用b数组的最小值来合并
sumb += 1l * b[i] + mina;// 每一列都用a数组的最小值来合并
}
printWriter.println(Math.min(suma, sumb));
}
C - Make it Alternating
题目描述
给定一个二进制字符串s
,你可以对s
进行任意次删除字符的操作,使得s
中的字符交替出现。求出使得s
中所有字符交替出现的最少操作次数和方案总数。
思路:数学+思维+全排列
- 最少操作数即将删除所有连续出现的字符使其变为单独的一个的操作数总和。
- 方案数即对所有选法方案进行阶乘,例如输入为
0001100
,那么我们选择的方案总数为 C 3 2 ∗ C 2 1 ∗ C 2 1 ∗ A 4 4 C_{3}^{2} * C_{2}^{1} * C_{2}^{1} * A_{4}^{4} C32∗C21∗C21∗A44。
static int mod = 998244353;
public static void solve() throws IOException {
String s = readString();
int minOp = 0;
long totalOps = 1;
for (int l = 0, r = 0; l < s.length(); l = r) {
while (r < s.length() && s.charAt(l) == s.charAt(r)) {
r++;
}
minOp += r - l - 1;// 将连续相同的字符个数再-1
totalOps = (totalOps * (r - l)) % mod;
}
for (int i = 1; i <= minOp; i++) {
totalOps = (totalOps * i) % mod;
}
printWriter.println(minOp + " " + totalOps);
}