Codeforces Round #258 (Div. 2)[ABCD]

Codeforces Round #258 (Div. 2)[ABCD]

ACM

题目地址:Codeforces Round #258 (Div. 2)

A - Game With Sticks

题意:

Akshat and Malvika两人玩一个游戏,横竖n,m根木棒排成#型,每次取走一个交点,交点相关的横竖两条木棒要去掉,Akshat先手,给出n,m问谁赢。

分析:

水题,很明显不管拿掉哪个点剩下的都是(n-1,m-1),最后状态是(0,x)或(x,0),也就是拿了min(n,m)-1次,判断奇偶即可。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        A.cpp
*  Create Date: 2014-07-24 23:32:17
*  Descripton:
*/

#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 0;
int a, b;

int main() {
	scanf("%d%d", &a, &b);
	if (min(a, b) % 2) {
		puts("Akshat");
	} else {
		puts("Malvika");
	}
	return 0;
}

B - Sort the Array

题意:

给一个序列,求是否能够通过翻转中间一段数使得整个序列递增,并给翻转区间。

分析:

数为10^5个,所以直接排序,然后找出区间验证即可。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        B.cpp
*  Create Date: 2014-07-24 23:49:35
*  Descripton:
*/

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1e5 + 10;

int n, beg, end, flag;
int a[N], b[N];
bool cont;

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
		b[i] = a[i];
	}

	sort(b, b + n);
	beg = 0;
	end = n - 1;
	while (beg < n && a[beg] == b[beg])
		beg++;
	while (end >= 0 && a[end] == b[end])
		end--;
	if (beg == n) {
		printf("yes\n");
		printf("1 1\n");
		return 0;
	}
	flag = true;
	for (int i = 0; i <= end - beg; i++) {
//		cout << b[beg + i] << ' ' << a[end - i] << endl;
		if (b[beg + i] != a[end - i]) {
			flag = false;
			break;
		}
	}
	if (flag) {
		printf("yes\n");
		printf("%d %d\n", beg + 1, end + 1);
	} else {
		printf("no\n");
	}

	return 0;
}

C - Predict Outcome of the Game

题意:

三支球队要进行n场足球比赛,已经进行了k场,已知一二两队胜局相差d1,二三两队胜局相差d2,问接下去有没可能出现三队胜局都一样,也就是平局的情况。

分析:

我们只知道是相差d1,d2,而不知道是那边比较多,所以有四种情况,判断四种情况就行了:

  1. 判断已比赛场数的合法性: 判断已经进行的比赛场数s是否已经超过k了,如果没有超过,判断(k-s)是否能被3整除
  2. 判断剩余场数: 判断剩余场数能否把三队胜局填平,如果可以,看扣掉填平后的剩余场数是否能被3整除。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        C.cpp
*  Create Date: 2014-07-25 00:34:20
*  Descripton:
*/

#include <iostream>
using namespace std;
typedef long long ll;

ll t, k, n, d1, d2, md;

bool jg(ll a, ll b, ll c) {
	ll s = a + b + c;
	if (k < s || (k - s) % 3)
		return 0;
	ll  t = n - k - (3 * max(max(a, b), c) - s);
	if (t < 0 || t % 3)
		return 0;
	return 1;
}

int main() {
	cin >> t;
	while (t--) {
		cin >> n >> k >> d1 >> d2;
		md = max(d1, d2);
		if (jg(0, d1, d1 + d2) ||
			jg(d1 + d2, d2, 0) ||
			jg(d1, 0, d2) ||
			jg(md - d1, md, md - d2))
			cout << "yes" << endl;
		else
			cout << "no" << endl;
	}
	return 0;
}

D - Count Good Substrings

题意:

由a和b构成的字符串,如果压缩后变成回文串就是Good字符串。问一个字符串有几个长度为偶数和奇数的Good字串。

分析:

可以发现,不管怎么样,压缩后的字符串是...ababab...这种格式的,所以首尾字符相同,那就是Good字符串了。

我们还要证明下任意good字串的首尾字符串都是一样的,这不难。

奇偶问题的话,可以发现任意两个奇数位置上的a及中间的字符组成的字符串都是奇数长度的,同理偶数位置和b。奇数位置上的a和偶数位置上的a的字符串是偶数长度的。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        D.cpp
*  Create Date: 2014-07-25 10:49:46
*  Descripton:
*/

#include <iostream>
#include <string>
#define f(a) (a*(a-1)/2)
using namespace std;

string s;
long long r[2][2];

int main() {
	cin >> s;
	for (int i = 0; s[i]; i++)
		r[i&1][s[i]-'a']++;
	cout << r[0][0] * r[1][0] + r[0][1] * r[1][1] << ' '
	  	<< f(r[0][0]) + f(r[0][1]) + f(r[1][0]) + f(r[1][1]) + s.length() << endl;
	return 0;
}


总结:Orz帆神AK,E题涉及逆元,回头补上~

Codeforces Round #258 (Div. 2)[ABCD]

时间: 2024-10-25 15:39:20

Codeforces Round #258 (Div. 2)[ABCD]的相关文章

Codeforces Round #258 (Div. 2)

A - Game With Sticks 题目的意思: n个水平条,m个竖直条,组成网格,每次删除交点所在的行和列,两个人轮流删除,直到最后没有交点为止,最后不能再删除的人将输掉 解题思路: 每次删除交点所在的行和列,则剩下n-1行和m-1列,直到行或列被删完为止,最多删除的次数为min(n,m),删除min(n,m)后剩余的都是行或者列(注意行与行,列与列之间不可能有交点).只需要判断min(n,m)的奇偶性. #include <iostream> #include <vector&

Codeforces Round #258 (Div. 2) B. Sort the Array(简单题)

题目链接:http://codeforces.com/contest/451/problem/B ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

Codeforces Round #258 (Div. 2) A. Game With Sticks(数学题)

题目链接:http://codeforces.com/contest/451/problem/A ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

Codeforces Round #258 (Div. 2) 小结

A. Game With Sticks (451A) 水题一道,事实上无论你选取哪一个交叉点,结果都是行数列数都减一,那如今就是谁先减到行.列有一个为0,那么谁就赢了.因为Akshat先选,因此假设行列中最小的一个为奇数,那么Akshat赢,否则Malvika赢. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace

Codeforces Round #258 (Div. 2/A)/Codeforces451A_Game With Sticks

解题报告 http://blog.csdn.net/juncoder/article/details/38102263 n和m跟木棍相交,问一人取一交点(必须是交点,且取完后去掉交点的两根木棍),最后谁赢 思路: 取最大正方形,以对角线上的交点个数判断输赢. #include <iostream> #include <cstdio> using namespace std; int main() { int m,n; while(cin>>n>>m) { i

Codeforces Round #258 (Div. 2/C)/Codeforces451C_Predict Outcome of the Game(枚举)

解题报告 http://blog.csdn.net/juncoder/article/details/38102391 题意: n场比赛其中k场是没看过的,对于这k场比赛,a,b,c三队赢的场次的关系是a队与b队的绝对值差d1,b队和c队绝对值差d2,求是否能使三支球队的赢的场次相同. 思路: |B-A|=d1 |C-B|=d2 A+B+C=k 这样就有4种情况,分别是: B>A&&C<B B>A&&C>B B<A&&C<

Codeforces Round #258 (Div. 2)Devu and Flowers 容斥原理

题目:Codeforces Round #258 (Div. 2)Devu and Flowers 题意:n个boxes ,第i个box有fi个flowers,每个boxes中的flowers完全相同,不同boxes的flowers不同,求从n个boxes中取出s个flowers的方案数.n<=20,s<=1e14,fi<=1e12. 排列组合的题目,一解法可用容斥原理(inclusion exclusion principle) . 有2中写法dfs和集合.下为集合写法. #inclu

Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

http://blog.csdn.net/rowanhaoa/article/details/38116713 A:Game With Sticks 水题...每次操作,都会拿走一个横行,一个竖行. 所以一共会操作min(横行,竖行)次. #include<stdio.h> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> #include&l

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/