题意: 有好多奖杯和奖章,要放在什么玩意里面。1、两样不能放在一个容器里。2、一个容器不能放5个奖杯。3、一个容器不能放10个奖章。给n个容器问能否放完?
题解: 很水,算一下总共用的容器和给的个数比较。
题意: 给两个串S、T,问通过两种操作能不能把S转变成T。1、suffix automaton就是删除一个字符。2、suffix array交换任意两个字母。
题解: 如果T中有S中没有的字母,不能变换。如果S和T的最长公共子序列是T就只用automaton。如果S、T长度一样就只用array。否则both。
题意: 有n个宽度是1的木板,木板间没有空隙。往上面刷油漆,可以横着刷也可以竖着刷。问最少多少下刷完。
题解: 木板分为两部分,下面大家一样长的部分和上面不一样长的突起。上面不一样长的突起又分别形成了一个新的子问题。递归的求解问题,
下面横着刷加上面递归求得的次数跟竖着刷比较,要较小的值。
题意: 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;
}