现在的位置: 首页 > 综合 > 正文

Codeforces Round #256 (Div. 2)

2018年02月23日 ⁄ 综合 ⁄ 共 1067字 ⁄ 字号 评论关闭

A. Rewards

题意: 有好多奖杯和奖章,要放在什么玩意里面。1、两样不能放在一个容器里。2、一个容器不能放5个奖杯。3、一个容器不能放10个奖章。给n个容器问能否放完?

题解: 很水,算一下总共用的容器和给的个数比较。

B.
Suffix Structures
  

题意:
给两个串S、T,问通过两种操作能不能把S转变成T。1、suffix automaton就是删除一个字符。2、suffix array交换任意两个字母。

题解:
如果T中有S中没有的字母,不能变换。如果S和T的最长公共子序列是T就只用automaton。如果S、T长度一样就只用array。否则both。

C.
Painting Fenc

题意:
有n个宽度是1的木板,木板间没有空隙。往上面刷油漆,可以横着刷也可以竖着刷。问最少多少下刷完。

题解:
木板分为两部分,下面大家一样长的部分和上面不一样长的突起。上面不一样长的突起又分别形成了一个新的子问题。递归的求解问题,

下面横着刷加上面递归求得的次数跟竖着刷比较,要较小的值。

D.
Multiplication Table

题意:
n*m的矩阵,每个格子填入i*j,将所有的数按非递减排列,求第k个数。即求所有的数中(可重复)第K小的数。

题解:
这题思路很明确二分的搜答案,每次求小于等于一个数的所有数的和。比赛的时候第一次没注意爆int,wa了。然后二分的时候没考虑答案可能矩阵中

不存在,wa了。然后又对答案二分往前找,求最小的那个,小数据过了,大数据wa了。今天试了试,最后往前找的时候不用二分直接遍历就可以不会

超时脑残啊…………

今天又看了大神们的代码,惊奇的发现大神直接用二分的下线来找第一个大于等于K的数,突然感觉二分还可以,好神奇啊!自己好渣渣啊~~

付某大神代码膜拜:多么的简洁明了……

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

long long n, m, k;

long long cal(long long a) {
	long long ret = 0;
	for (int i = 1; i <= n; ++i) {
		ret += min(a / i, m);
	}
	return ret;
}

int main() {
	cin >> n >> m >> k;
	long long l = 1, r = n * m + 1;
	while (l < r) {
		long long m = l + r >> 1;
		if (cal(m) < k) {
			l = m + 1;
		} else {
			r = m;
		}
	}
	cout << l << endl;
	return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.