10.21上午考试

最近考试又开始下滑了。

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;
}
原文地址:https://www.cnblogs.com/oier/p/9826327.html