codeforces 902(a,b,c,d)

这场打的也很菜,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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值