**活動遵守以下規則:
乙個消費者 —— 想參加**活動的消費者,在賬單下記下他自己所付的費用,他個人的詳細情況,然後將賬單放入乙個特殊的投票箱。
當每天**活動結束時,從投票箱中抽出兩張賬單:第一張被抽出的賬單是金額最大的賬單。然後被抽出的是金額最小的賬單,對於付了金額最大賬單的這位消費者,將得到一定數目的獎金,其獎金數等於他賬單上的金額與選出的最小金額的差。
為了避免乙個消費者多次獲獎,根據上面所抽出的兩張賬單都不返回到投票箱,但是剩下的賬單還繼續參加下一天的**活動。
超市的售出額是巨大的,這樣可以假定,在每天結束,拿出數額最大賬單和數額最小賬之前,在投票箱內就已經至少存在了 2 張賬單。你的任務是去計算每天**活動投進投票箱的賬單數額的基本資訊。在整個活動中開銷總數。
本題中約定:
整個活動持續了 n 天 (n<=5000) 。 第 i 天放入的帳單有 a[i] 張, a[i]<=10^5 。且 sigma(a[1]...a[n])<=10^6 。 每一天放入的帳單的面值均 <=10^6 。
第一行是乙個整數 n ( 1 <= n <= 5000 ),表示**活動歷時的天數。
以下的 n 行,每行包含若干由空格分隔的非負整數。第 i+1 行的數表示在第 i 天投入箱子的賬單金額。每行的第乙個數是乙個整數 k ( 0 <= k <= 10^5 ), 表示當日賬單的數目。後面的 k 個正整數代表這 k 筆賬單的金額,均小於10^6 。
整個活動中涉及到的賬單筆數不會超過 10^6 。
輸出唯一一行是乙個整數,等於整個**活動中應該付出的獎金總額。
53 1 2 3
2 1 1
4 10 5 5 1
01 2
這幾道題目用來stl練手
是stl的好題
因為每一次都要維護最大值和最小值,並且存在重複的數字。
這就是multiset的妙用
multiset內部的資料儲存的時候已經是有序的,可以使用迭代器直接遍歷乙個multiset,並且與set不同,multiset會保留容器內的重複元素。
直接上**了:
#include#include#include#include#include#include#include#include#includeusing namespace std;
int n,k,a;
multisetbill;
int main()
multiset::iterator t1,t2;
t1=bill.begin();
t2=bill.end();
t2--;
ans+=*t2-*t1;
bill.erase(t1);
bill.erase(t2);
} cout
}
POI2000 迷宮的牆
迷宮的牆 給出一棵有 n 1 個節點樹,每個節點都有一種顏色,一共只有三種顏色,每個非葉子節點的出度為 3 每個節點都指向編號比自己大的節點。樹以 1 號節點為根,樹的所有葉子節點都指向節點 n 而且每個節點的三條邊是有順序的,編號為 1,2,3 針對每一條 1 to n 的路徑,我們可以用一次遍歷...
POI2000 最長公共子串
求多個串的最長公共子串。聽說如果會 sa m 的話這題就很簡單了 然而我只會用 sa 做,具體做法是先用不同的分隔符把字串接成乙個串 然後還是按 he ight i 從大到小將 i 的集合與 i 1的集合合併 對每個集合維護乙個 se t i 用來記錄 i 的集合中出現了哪些字串的子串 注意 se ...
BZOJ2938 Poi2000 病毒 AC自動機
題目鏈結 發現乙個合法的串一定不會與病毒串匹配 如果讓它無限長,就說明一直匹配不到病毒串 如果找到乙個不經過病毒點的環,那麼就存在無限長度的合法串 ac自動機建完圖後,再用dfs判斷即可 如下 include include include include define n 30050 using ...