题意: 有好多奖杯和奖章,要放在什么玩意里面。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; }