2025华中农业大学第十四届程序设计竞赛¶
2025-05-07
gym: https://codeforces.com/gym/105838
之前随便打了一下,有的题没有补,之后看到再来。
A¶
挺简单,就是模拟就行。本来py写,但是一直运行过不了,改C++写也是调了一会才过。主要其实就是东西稍微有点多。
后来看了,我写数组没写下标。。。它没告诉我是这个问题,,,好像是我没安py插件,安了是不是不会这样,还有有时候可以把py用熟练点。
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n, m, k;
cin >> n >> m >> k;
vector<int> b(m + 1), r(m + 1), x(n + 1), y(n + 1);
for(int i = 1; i <= m; i++)
cin >> b[i];
for(int i = 1; i <= m; i++)
cin >> r[i];
vector<vector<int>> p(m + 1, vector<int>(n + 1));
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
cin >> p[i][j];
for(int i = 1; i <= n; i++) cin >> x[i];
for(int i = 1; i <= n; i++) cin >> y[i];
vector<int>mx(m + 1);
for(int i = 1; i <= m; i++)
mx[i] = *max_element(p[i].begin() + 1, p[i].end());
int ans = 0;
for(int i = 1; i <= n; i++){
int get = min(100, x[i] / 60 + y[i]);
vector<int> tmp;
for(int j = 1; j <= m; j++){
if(p[j][i] == -1)
tmp.push_back(0);
else if(p[j][i] == 0)
tmp.push_back(b[j]);
else
tmp.push_back(b[j] + r[j] * p[j][i] / mx[j]);
}
sort(tmp.begin(), tmp.end(), greater<int>());
int practice = 0;
for(int j = 0; j < k; j++)
practice += tmp[j];
if(practice >= 50 * k && get >= 50 && (get >= 60 || practice >= k * 60))
ans++;
// cerr << practice << " " << get << '\n';
}
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
while(T--)
solve();
return 0;
}
哦对了,py定义二维数组不能直接 [[0] * m] * n
这样对单个修改,所有的都会改。需要像 [[0] * m for _ in range(n)]
for _ in range(int(input())):
n, m, k = map(int, input().split())
b = list(map(int, input().split()))
r = list(map(int, input().split()))
score = [0] * n
# p = [[]] * m
p = [[] for i in range(m)]
for i in range(m):
p[i] = list(map(int, input().split()))
x = list(map(int, input().split()))
y = list(map(int, input().split()))
# print(x,y);
# print(p)
pmax = [0] * m # 每场比赛的最高分
# get = [[]] * n
get = [[] for i in range(n)]
for i in range(m):
for j in range(n):
pmax[i] = max(pmax[i], p[i][j])
for i in range(n):
for j in range(m):
if p[j][i] == -1:
get[i].append(0)
elif p[j][i] == 0:
get[i].append(b[j])
else:
# print(type(pmax[j]))
# num = r * (int)(p[j][i]) + pmax[j] - 1
# print(num)
# print((b[j] + (r[j] * p[j][i]) // pmax[j]))
get[i].append(b[j] + (r[j] * p[j][i]) // pmax[j])
# print(i,get[i])
# print(get)
ans = 0
for i in range(n):
# print(get[i])
get[i].sort(reverse = True)
# print(x[i], y[i], "xy")
A = x[i] // 60 + y[i]
B = 0
for j in range(k):
B += get[i][j]
# print(A, B, "AB")
if A >= 50 and B >= 50 * k and (A >= 60 or B >= 60 * k):
ans += 1
print(ans)
B¶
签到
a = list(map(int, input().split()))
a.sort()
if a[1] > a[0] and a[2] > a[0]:
# a[1] > a[0] , a[0] < a[2]
print(a[1],a[0],a[2])
else:
print(-1)
C¶
挺简单,要使得 \(\frac{1}{x} + \frac{1}{y}\) 最小,且 \(x + y\) 的值固定,那么显然 \(xy\) 越大越好,就是 \(x\) 和 \(y\) 的值越接近越好,那么二分找一下就行。
那我为什么 WA 很多次呢?快速幂传参数,忘记给 \(a\) 取模了,这个很重要,以后注意。
/*
1/x + 1/y
(x+y)/xy
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
using ll = long long;
constexpr int mod = ll(1e9) + 7;
ll ksm(ll a, ll b)
{
ll res = 1;
a %= mod;
while(b){
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
ll inv(ll a){return ksm(a, mod - 2);}
void solve()
{
// for(int x = 1; x <= 99; x++)
// cout << 1.0/x + 1.0/(100-x) << '\n';
int n, q;
cin >> n >> q;
vector<int>a(n + 1), pre(n + 1);
for(int i = 1; i <= n; i++){
cin >> a[i];
pre[i] = pre[i - 1] + a[i];
}
while(q--){
int L, R;
cin >> L >> R;
int mid = (pre[R] - pre[L - 1] + 1)/2 + pre[L - 1];
auto it = lower_bound(pre.begin() + L, pre.begin() + R, mid);
// cerr << it - pre.begin() << '\n';
// if(it == pre.begin() + R){
// cout << (inv(a[R]) + inv(pre[R - 1] - pre[L - 1])) % mod << ' ';
// continue;
// }
// if(it == pre.begin() + L){
// cout << (inv(a[L]) + inv(pre[R] - pre[L])) % mod << ' ';
// continue;
// }
int idx = it - pre.begin();
ll X = 0;
for(int j = max(L, idx - 1); j <= min(idx + 1, R - 1); j++){
X = max(X, 1LL * (pre[j] - pre[L - 1]) * (pre[R] - pre[j]));
}
cout << 1LL * (pre[R] - pre[L - 1]) * inv(X) % mod << ' ';
}
cout << '\n';
}
signed main()
{
// freopen("1.err", "w", stderr);
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T = 1;
cin >> T;
while(T--)
solve();
return 0;
}
D¶
签到
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n;
cin >> n;
vector<bool>vis(n + 1);
for(int i = 1; i <= n; i++){
int x;
cin >> x;
vis[x] = true;
}
for(int i = 1; i <= n; i++){
if(!vis[i]){
cout << i << '\n';
return;
}
}
cout << "-1\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
while(T--)
solve();
return 0;
}
H¶
签到
r = [0] * 100001
c = [0] * 100001
for _ in range(int(input())):
n = int(input())
x = list(map(int,input().split()))
y = list(map(int,input().split()))
# print(x)
# print(y)
ans = 0
for i in range(n):
ans += r[x[i]] + c[y[i]]
r[x[i]] += 1
c[y[i]] += 1
print(ans)
for i in range(n):
r[x[i]] -= 1
c[y[i]] -= 1
K¶
签到
#include<bits/stdc++.h>
using namespace std;
void solve()
{
string s;
cin >> s;
for(int i = 0; i + 1 < s.size(); i++){
if(s[i] < s[i + 1]){
swap(s[i], s[i + 1]);
break;
}
}
cout << s << '\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
while(T--)
solve();
return 0;
}