码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #304 (Div. 2)

时间:2015-05-23 15:36:14      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:acm   codeforces   


题目传送: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;
}








Codeforces Round #304 (Div. 2)

标签:acm   codeforces   

原文地址:http://blog.csdn.net/u014355480/article/details/45934551

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!