http://codeforces.com/contest/367
A:
注意点细节就行了
B:
太伤了,比赛时候没想太多,果断开启乱搞模式,乱搞了几个哈希函数,5个乱搞!不过赛后煎熬的等待还是RE了。。。不过事实证明我的哈希乱搞是对的,有个地方没开long long判断导致错了!后来去敲正解的,居然也RE在38组!太雷了,m*p是会爆int的,总是这么不小心,所以说细心写代码比速度更更重要,正解是map映射下维护下每个数的cnt值扫一遍判断就可以了,贴一下两个代码。。。
hash乱搞code:
#include
#include
#include
#include
#include
正解:
#include
#include
#include
#include
#include
C题:
比赛时候也想到了这个有点像欧拉回路,因为是在最后时候想出来的,结果是没仔细分析奇偶性,出了后去了趟厕所回来就被hack了,想了下4个不同数的时候答案是8,改了下急忙交了。。。还是没仔细分析。。。结果最后一分钟又被hack了。。这些人hack我好欢乐啊= =总的来说是应对策略太搓,凡事都要仔细仔细再仔细,确保是完全无误的,每次都这样的话会很有进步的,虽然不是表现在算法能力上,这是综合素质。
思路:对于n为奇数的情况,每个点的度数为偶数,所以相当于走一遍欧拉回路就可以了,需要n*(n-1)/2 + 1个位置。n为偶数的话,度数为奇数,那么先把偶数个走完一次欧拉回路,然后剩余的都是度数为1,也就是分别两个两个有边,都需要分开走完,所以需要n个位置,总的需要n*(n-1)/2 - n/2 + n个位置。
code:
#include
#include
#include
using namespace std;
typedef __int64 ll;
const int maxn = 100000 + 10;
int w[maxn];
int main() {
int n, m, q;
scanf("%d%d", &n, &m);
for(int i = 1;i <= m; i++)
scanf("%d%d", &q, &w[i]);
sort(w + 1, w + m + 1);
reverse(w + 1, w + m + 1);
ll cnt = 1;
while((cnt + 1) * (cnt + 2)/2 + 1 <= n) cnt += 2;
ll ans = cnt;
cnt = 0;
while((cnt+2)*(cnt+2)/2 <= n) cnt += 2;
cnt = max(cnt, ans);
ans = 0;
for(int i = 1;i <= m && i <= cnt; i++)
ans += w[i];
printf("%I64d\n", ans);
return 0;
}