文章目录
Educational Codeforces Round 104 (Rated for Div. 2)
A. Arena
题意: n个英雄,每个英雄有一个权值,权值大的能够赢权值小的,只要一个英雄能够赢一场,那么这个英雄就可以当赢家,问有多少个英雄不能当赢家。
题解: 思维。只需要找到最小的这批人,这些人永远不可能赢,对着他们揉就行。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int const MAXN = 2e5 + 10;
int n, m, T;
map<int, int> mp;
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> T;
while (T--) {
cin >> n;
mp.clear();
int mi = 110;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
mp[x]++;
mi = min(mi, x);
}
cout << n - mp[mi] << endl;
}
return 0;
}
B. Cat Cycle
题意: 有两只猫,猫A从n->1走,猫B从1->n走,如果1~n是个首尾相接的环,如果相遇地话,猫A地优先级更高,现在问时间k是猫B会再哪?
题解: 分类讨论+思维。
分奇偶性讨论。
- 如果为偶数,那么两只猫永远不会相遇,那么只需要直接取模
- 如果为奇数,那么每n/2次就会相遇,因此只需要计算相遇多少次,然后加上再取模即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
int T;
scanf("%lld", &T);
for (int i = 0; i < T; i++) {
int n, k;
scanf("%lld %lld", &n, &k);
k--;
int ans;
int d = n / 2;
if (n % 2)
ans = ((d + 1) * k / d) % n + 1;
else
ans = k % n + 1;
printf("%lld\n", ans);
}
return 0;
}
C. Minimum Ties
题意: 有n个球队踢球,任意2个球队会进行一场比赛,要不然赢要不然输,如果比赛有输赢,那么赢的得3分,输的不得分;如果比赛是平均,那么输赢各得1分。现在要让每个队伍最后得分一样,且平局数目最少。问如果安排比赛,打印其方案?
题解: 构造。要让所有队伍得分一样,且平局数目最少,那么就要每个队伍输赢尽可能一样,然后不能安排的就平局。如果n为奇数,那么一个队伍就可以赢n/2场,输n/2场;如果n为偶数,那么一个队伍就可以赢(n-1)/2场,输(n-1)/2场,剩下一场平局。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
int t;
int main() {
cin >> t;
while (t--) {
int n;
cin >> n;
if (n % 2 == 0) {
for (int i = 1; i <= n - 1; i++) {
for (int j = i + 1; j < min(n+1, i + (n / 2)); j++) {
cout << 1 << ' ';
}
if (i <= (n) / 2) {
cout << 0 << ' ';
for (int j = min(n, i + (n / 2)) + 1; j <= n; j++) {
cout << "-1" << ' ';
}
}
}
}
else{
for (int i = 1; i <= n - 1; i++) {
for (int j = i + 1; j <= min(n, i + (n / 2)); j++) {
cout << 1 << ' ';
}
if (i <= (n) / 2+1) {
for (int j = min(n, i + (n / 2)) + 1; j <= n; j++) {
cout << "-1" << ' ';
}
}
}
}
cout << endl;
}
return 0;
}
D. Pythagorean Triples
题意: 给定一个n,要求找到满足 1 < = a < = b < = c < = n 1<=a<=b<=c<=n 1<=a<=b<=c<=n的 a 2 = b + c a^2=b+c a2=b+c且 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2的数目。 1 < = n < = 1 0 9 1<=n<=10^9 1<=n<=109
题解: 因为 b 、 c < = 1 0 9 b、c<=10^9 b、c<=109,所以 a 2 < = 1 0 9 a^2<=10^9 a2<=109,那么 a < = s q r t ( 1 0 9 ) a<=sqrt(10^9) a<=sqrt(109)。将 c = a 2 − b c=a^2-b c=a2−b代入 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2,得到 a 2 ∗ ( a 2 − 2 b − 1 ) = 0 a^2*(a^2-2b-1)=0 a2∗(a2−2b−1)=0,则 a 2 − 2 b − 1 = 0 a^2-2b-1=0 a2−2b−1=0。因此,可以枚举a,然后判断是否为奇数,然后求出对应的b和c,判断是否小于等于n即可。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
int const MAXN = (int)sqrt(2e9) + 1;
int n, m, T;
signed main() {
T = read();
while (T--) {
n = read();
int ans = 0;
for (int a = 1; a <= min(n, MAXN); a++) {
int a2 = a * a;
int b = (a2 - 1) / 2;
int c = a2 - b;
if (a2 % 2 && b <= n && c <= n && a <= b && b <= c) ans++;
}
// cout << "ans:";
// cout << ans << endl;
printf("%lld\n", ans);
}
return 0;
}
E. Cheap Dinner
题意: 合格的晚餐由四道菜组成,分别是第一道菜、第二道菜、饮品、甜品。每道菜分别有 a i 、 b i 、 c i 、 d i a_i、b_i、c_i、d_i ai、bi、ci、di种菜品可以选择,且知道它们分别的价格。相邻两种菜可能存在互斥关系,即不能同时上桌。给出四道菜分别有多少菜品可选以及它们的价格、互斥关系,求最少用多少钱可以构出一桌晚餐。
题解: 数据结构+dp。
代码: