1. 程式人生 > >10.21上午考試

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;
}