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\n", (ans - 1) / 2);
fclose(stdin);
fclose(stdout);
return 0;
}