这场打的也很菜,a出的还行,11分钟,结果b俩小时没贪出来!?难蚌
A
#include<iostream>
using namespace std;
void solve() {
int n; cin >> n;
int a;
int ans = 0;
n--;
while (n--) {
cin >> a;
ans += a;
}
ans = -ans;
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
B
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int M = 1e5 + 9;
using ll = long long;
struct st {
ll a, b;//人数,成本
}poe[M];
bool cmp(st x, st y) {
if (x.b != y.b)return x.b < y.b;
else return x.a > y.a;
}
void solve() {
ll n, p; cin >> n >> p;
for (int i = 1; i <= n; i++)cin >> poe[i].a;
for (int i = 1; i <= n; i++)cin >> poe[i].b, poe[i].b = min(poe[i].b, p);
ll ans = p;//成本
ll ret = 1;//人数
sort(poe + 1, poe + n + 1, cmp);
for (int i = 1; i <= n; i++) {
if (ret + poe[i].a > n) {
ans += poe[i].b * (n - ret);
break;
}
else {
ans += poe[i].b * poe[i].a;
ret += poe[i].a;
}
}
cout<< ans << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
C
思路
推一下可知,k最大为3,如果超过3,就没有方案能满足
因为各个位置求的是余数
所以分成k为1,2,3来考虑
如果k=1,则只有一种情况,就是都是0
如果k=2,这要求从初始值一步变成0,则要么m比n小,要么m是n的倍数
如果k=3,就是总方案减去上面的方案数
ACcode
#include<iostream>
using namespace std;
void solve() {
int n, m, k; cin >> n >> m >> k;
if (k > 3) { cout << 0 << '\n'; return; }
if (k == 1) { cout << 1 << '\n'; return; }
if (k == 2) {
cout << (min(n - 1, m) + m / n) << '\n';
return;
}
if (k == 3) {
cout << (m - min(n - 1, m) - m / n) << '\n';
return;
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
D
这个题题目读半天没懂,就是理解起来困难,其他跟高中数学组合数一样
题意
你有一个含n个单元的初始是白色的数组,每个单元都有自己的权值wi,一次操作中你可以任选一个或多个索引,将他们涂成黑色,然后把为黑色数组元素索引的倍数的数组元素涂成绿色,这次操作你的得分就是所有黑色和绿色的元素中的最大权值,找出所有可能方式的得分总和
ACcode
#include<iostream>
#include<algorithm>
using namespace std;
const int MOD = 998244353;
using ll = long long;
const int M = 1e5 + 9;
ll a[M], s[M], p[M];
void init(int x) {
p[0] = 1;
for (int i = 1; i <= x; i++)p[i] = p[i - 1] * 2ll % MOD;
}
bool cmp(ll x, ll y) {
return x > y;
}
void solve() {
int n; cin >> n;
init(n);
for (int i = 1; i <= n; i++)cin >> a[i];
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j += i) {
s[i] = max(s[i], a[j]);
}
}
ll ans = 0;
ans = (ans + s[1] * p[n - 1]) % MOD;
sort(s + 2, s + 1 + n, cmp);
for (int i = 2; i <= n; i++) {
ans = (ans + s[i] * p[n - i]) % MOD;
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
solve();
return 0;
}