最近考试又开始下滑了。
70+100+35=205,rank6
反思:T1边界条件,卡了10分。
T3,没有注意到3的n/2正解,打了2的n,卡掉了。
以后注意积累吧
主要是看RP
最近好像是脑洞不够用了
绩效等级
( grade.*)
问题描述:
在 CZYZ 每个老师都要算绩效,当然,绩效跟完成的任务数量 w 有关,可以表示为以下公式: s = 10000 - (100 -w)^2。现在呢,校长想算出所有人的绩效,看看其中的众数是多少,如果有多个众数则分别输出如果不止一种数,所有数出现的频率都一样则不存在众数,输出“Bad Mushroom”(不含引号)。
众数: 是一组数据中出现次数最多的数值。
问题输入:
第一行一个整数 T,表示有 T 组数据。
每组数据第一行是一个整数 N,表示有 N 个人;第二行有 N 个整数用空格隔开,表示每个人完成的任务数量 wi。
问题输出:
对于每组数据:首先输出一行“Case #i:”, i 表示组数(格式见样例),然后输出一行若干个整数(之间用 1 个空格隔开),行末无多余空格。如不存在众数,输出“Bad Mushroom”(不含引号)。
样例输入:
3
6
100 100 100 99 98 101
6
100 100 100 99 99 101
6
100 100 98 99 99 97
样例输出:
Case #1:
10000
Case #2:
Bad Mushroom
Case #3:
9999 10000
数据规模:
对 30%的数据满足: 0 < N <= 1000。
对 100%的数据满足: 0 < N <= 1000000, 0 < wi < 200, 0 < T <= 5。
题解:
摸你题,要用桶排序
如果众数数量等于总数那么就是Bad了
注意!N=1时并不是Bad,这被卡了10分。
舞会配对
( ples.*)
问题描述:
在 NOI2015 闭幕式舞会上有 N 个男孩和 N 个女孩,每个人都量过了自己的身高。每个男孩只跟女孩跳舞,并且女孩也只跟男孩跳舞。每个人最多只有一个舞伴。男孩或者想和比自己高的女孩跳舞,或者想和比自己低的女孩跳舞,同样的,女孩也是或者想和比自己高的男孩跳舞,或者想和自己低的男孩跳舞。
你能决定最多有多少对能在一起跳舞么?
问题输入:
第一行是一个正整数 N(1 <= N <= 100000),表示男女的人数。
第二行包括 N 个绝对值在 1500 到 2500 的整数,每个整数的绝对值表示每个男孩的身高。如果是一个正整数,表示这个男的喜欢和比他高的女孩跳舞,如果是负整数,就表示这个男的喜欢和比他低的女孩跳舞。
第三行包括 N 个整数,每个整数的绝对值表示相应女孩的身高。同样的,如果是正整数的话,表示这个女孩喜欢和比她高的男孩跳舞,如果是负整数的话,表示这个女孩喜欢和比她低的男孩跳舞。
问题输出:
只有一行一个整数,表示最多的可以搭配的对数。
输入样例 1:
1
-1800
1800
输出样例 1:
0
输入样例 2:
1
1700
-1800
输出样例 2:
1
输入样例 3:
2
-1800 -2200
1900 1700
输出样例 3:
2
数据规模:
对于 50%的数据满足: N <= 5000;
对于 100%的数据满足: 1 <= N <= 100000。
题解:
一个喜欢高得女生的男生,一定和一个喜欢低的男生的女生跳舞
所以把所有男生女生分为两拨,然后贪心选就行
非常简单的题呢
平衡的子集
(subset.*)
问题描述:
JSOI2015 夏令营期间,营委会计划举办一次拔河比赛,以庆祝我们敬爱的李老爷爷八十大寿。为了使得比赛最激烈,我们希望将参加比赛的营员按照力气值之和分成尽可能平衡的两组。
现在假设夏令营有 N 个人,每个人的力气为 M(i)。
请大家计算:要使分成的两组力气之和完全相等,有多少种分法?
问题输入:
第一行一个整数 N,表示人数。
接下来 N 行,每行一个整数 M(i)。
问题输出:
输出一行一个整数,表示一共有多少种选法。
输入样例:
4 1 2 3 4
输出样例:
3
样例解释:
对于这 4 头奶牛,有以下 3 种选法:
第一种选出{1,2,3},分成{1,2}和{3}两组;
第二种选出{1,3,4},分成{1,3}和{4}两组;
第三种选出{1,2,3,4},分成{1,4}和{2,3}两组。
数据规模:
对于 40%的数据满足: 1 <= M(i) <= 1000;
对于 100%的数据满足: 2 <= N <= 20, 1 <= M(i) <= 100000000。
题解:
这题题面有毒,问的是有多少种选择人的方法,而不是有多少种分拨的方法。
直接搜索的复杂度是3的N次方,考虑双向搜索。
存储两部分元素值的差,存到两个vector中(记录选择情况和状态)
然后sort+双指针
具体看代码吧,这里站一下代码
复杂度上界是(O({3^{frac n 2}}^2)),但实际是不可能达到的
#include <bits/stdc++.h>
using namespace std;
struct fuck
{
int a[10], n;
map<int, int> res;
void search(int pos, int tot)
{
if (pos == n)
{
res[tot]++;
return;
}
search(pos + 1, tot);
search(pos + 1, tot + a[pos]);
search(pos + 1, tot - a[pos]);
}
} l, r;
int n, a[20], maxb, ans = 0;
int main()
{
freopen("subset.in", "r", stdin);
freopen("subset.out", "w", stdout);
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
int mid = n / 2;
l.n = mid;
r.n = n - mid;
for (int i = 0; i < mid; i++)
l.a[i] = a[i];
for (int i = mid; i < n; i++)
r.a[i - mid] = a[i];
l.search(0, 0);
r.search(0, 0);
long long ans = 0;
for (map<int, int>::iterator i = l.res.begin(); i != l.res.end(); i++)
{
int fuck = (*i).first;
ans += l.res[fuck] * r.res[-fuck];
}
printf("%lld
", (ans - 1) / 2);
fclose(stdin);
fclose(stdout);
return 0;
}