Codeforces Round #304 (Div. 2)

本文解析了Codeforces Round #304 (Div.2)的四道题目,包括士兵与香蕉(A)、士兵与徽章(B)、士兵与卡片(C)及士兵与数字游戏(D)。提供了AC代码及解题思路,涉及等差数列求和、标记数组应用、队列模拟及因子个数求和。
摘要由CSDN通过智能技术生成


题目传送:Codeforces Round #304 (Div. 2)




A. Soldier and Bananas


思路:水题,等差数列求个和就好了


AC代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;

int main() {
	int k, n, w;
	scanf("%d %d %d", &k, &n, &w);
	LL sum = w * (w + 1) / 2;
	sum = sum * k;
	if(n >= sum) {
		printf("0\n");
	}
	else cout << sum - n << endl;
	return 0;
}





B. Soldier and Badges


思路:用一个标记数组来搞,当前结点访问过就往后找,不过数组要开大点,6000以上,结果因为这被hack了


AC代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;

int vis[10005];

int main() {
	memset(vis, 0, sizeof(vis));
	int n;
	scanf("%d", &n);
	LL ans = 0;
	for(int i = 0; i < n; i ++) {
		int t;
		scanf("%d", &t);
		if(!vis[t]) vis[t] = 1;
		else {
			int k = t;
			for(; k < 10005; k ++) {
				if(!vis[k]) break;
			}
			ans += (k - t);
			vis[k] = 1;
		}
	}
	cout << ans << endl;
	return 0;
}





C. Soldier and Cards


思路:队列模拟一下即可,设置一个度来确定是否有没有人win,当超过这个度后即可默认为死循环了。


AC代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;

int main() {
	int n;
	int k1, k2;
	queue<int> q1, q2;
	scanf("%d", &n);
	scanf("%d", &k1);
	for(int i = 0; i < k1; i ++) {
		int t;
		scanf("%d", &t);
		q1.push(t);
	}
	scanf("%d", &k2);
	for(int i = 0; i < k2; i ++) {
		int t;
		scanf("%d", &t);
		q2.push(t);
	}
	
	int cnt = 0;
	int flag = 0;
	while(1) {
		if(q1.empty()) {
			flag = 2;
			break;
		}
		if(q2.empty()) {
			flag = 1;
			break;
		}
		if(cnt >= 500000) break;
		int t1 = q1.front();
		q1.pop();
		int t2 = q2.front();
		q2.pop();
		if(t1 > t2) {
			q1.push(t2);
			q1.push(t1);
		}
		else {
			q2.push(t1);
			q2.push(t2);
		}
		cnt ++;
	}
	if(flag == 1) {
		printf("%d 1\n", cnt);
	}
	else if(flag == 2) {
		printf("%d 2\n", cnt);
	}
	else {
		printf("-1\n");
	}
	return 0;
}




D. Soldier and Number Game


思路:题目很委婉,其实就是去求b+1到a区间内的数的因子个数总和,用暴力筛即可,但是很不幸的是用了cout超时了一次,然后我就跪啦。。。。


AC代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#include <ctime>
#define LL long long
#define INF 0x7fffffff
using namespace std;

const int maxn = 5000005;
int a[maxn];
int num[maxn];

LL sum[maxn];

void init() {
	for(int i = 0; i < maxn; i ++) {
		a[i] = i;
	}
	
	num[0] = 0;
	num[1] = 0;
	for(int i = 2; i < maxn; i ++) {
		for(int j = i; j < maxn; j += i) {
			while(a[j] != 1 && a[j] % i == 0) {
				num[j] ++;
				a[j] /= i;
			}
		}
	}
}

int main() {
	//freopen("in.txt", "r", stdin);
	init();
	for(int i = 1; i < maxn; i ++) {
		sum[i] = sum[i-1] + num[i];
	}
	int t;
	scanf("%d", &t);
	while(t --) {
		int a, b;
		scanf("%d %d", &a, &b);
		printf("%I64d\n", sum[a] - sum[b]); 
	}
	//printf("%d\n", clock());
	return 0;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值