【時間限制】1000ms 【空間限制】65536kb考試的時候直接通過樣例和自己造的幾組簡單規律得出了規律,但有部分錯誤:【輸入檔案】melon.in 【輸出檔案】melon.out
【題目描述】
todobe和yahsem66比賽吃瓜。
桌上一共有n塊瓜,他們可以從桌上拿走不多於k塊瓜來吃,吃一塊瓜需要1分鐘的時間,只有吃完手裡的所有瓜之後才可以再去拿瓜,拿瓜的時間不計。如果兩人在同一時間點拿瓜,yashem66會發揚謙讓精神讓todobe先拿,開始比賽時也是todobe先拿。
舉個例子,如果n=10,k=4,todobe先拿走3塊,yashem66拿走2塊,yashem66吃完之後todobe還有1塊沒有吃完。yashem66再拿走4塊,然後todobe就只能再吃到1塊,最終todobe吃了4塊,而yashem66吃了6塊。
兩個人都想盡可能吃更多的瓜,貪吃的todobe想知道她最多能吃到多少塊瓜。
【輸入】
輸入包括一行兩個整數,n、k。
【輸出】
輸出一行乙個整數,代表todobe最多能吃到多少塊瓜。
【樣例輸入1】
2 1【樣例輸出1】
1【樣例輸入2】
10 4
【樣例輸出2】
5【資料範圍與約定】
對於0%的資料,與樣例相同;
對於10%的資料,n<=2*k;
對於另30%的資料,k=2;
對於100%的資料,n,k<=100000。
問題在於n<=2k時,k不一定一定小於n,則需要k op n
分析過程(網上找的)
n<=k直接是n,k2k時,考慮一次只吃乙個瓜,這樣就有更大決策空間
當剩餘瓜數<=2*k時#接選k個
所以答案為ceil(n/2)
#include #include #include using namespace std;
const int maxn=100005;
int ans;
int main()
【時間限制】2000ms 【空間限制】524288kb考試的時候用的暴力回溯,20分。【輸入檔案】change.in 【輸出檔案】change.out
【題目描述】
todobe開了一家店,yashem66連續n天都會光顧這家店。
yashem66只有100元的紙幣和1元的硬幣,他知道todobe懶的一批,很討厭找零這件事情,每天todobe都會有乙個心情值wi,如果todobe第i天需要找零,那她的不愉悅度就會增加wi*找零的錢數。當todobe需要找零時,她也會找給yashem66若干1元硬幣,但她不會找給yashem66 100個及以上的硬幣。
假設yashem66一開始有足夠的紙幣和m個硬幣,他在第i天,會買價值ci元的產品。他想盡可能降低todobe的不愉悅度,請你告訴他todobe 的不愉悅度最少是多少。
【輸入】
第一行兩個整數n、m。
第二行有n個整數,第i個整數代表ci,第i天yashem66購買的**。
第三行有n個整數,第i個整數代表wi,第i天todobe的心情值。
【輸出】
輸出一行乙個整數代表todobe不愉悅度的最小值。
【樣例輸入1】
5 42
117 71 150 243 200
1 1 1 1 1
【樣例輸出1】
79【樣例解釋1】
第一天花費1張100元紙幣和17個1元硬幣,剩餘25個硬幣,不愉悅度為0;
第二天花費1張100元紙幣,找零29,剩餘54個硬幣,不愉悅度為29;
第三天花費2張100元紙幣,找零50,剩餘104個硬幣,不愉悅度為79;
第四天花費2張100元紙幣和43個1元硬幣,剩餘61個硬幣,不愉悅度為79;
第五天花費2張100元紙幣,不愉悅度為79.
【樣例輸入2】
5 42
117 71 150 243 200
5 4 3 2 1
【樣例輸出2】
230【樣例解釋2】
第一天花費1張100元紙幣和17個1元硬幣,剩餘25個硬幣,不愉悅度為0;
第二天花費1張100元紙幣,找零29,剩餘54個硬幣,不愉悅度為116;
第三天花費1張100元紙幣和50個1元硬幣,剩餘4個硬幣,不愉悅度為116;
第四天花費3張100元紙幣,找零57,剩餘61個硬幣,不愉悅度為230;
第五天花費2張100元紙幣,不愉悅度為230.
【資料範圍與約定】
對於0%的資料與樣例相同;
對於20%的資料,n<=20;
對於另20%的資料,ci=1;
對於100%的資料,n<=105,m<=109,1<=ai,ci<=10^5。
正解:
貪心,貪每一步都讓找零的時候最小的不快樂值,每次硬幣不夠的時候就取不快樂值最小的那次的硬幣。
以下的「錢」都指需要付的硬幣數量,並令當前硬幣量為coin
考慮每一步:
將需要找零時的不快樂指數存在乙個堆中
因為不管錢夠還是不夠都需要付這部分錢:
則coin-=c[i];
如果coin<0
則取不快樂指數最小的取出並加上。
現在的硬幣數量為coin+100
(因為找零的數量為:100-c[i])
#include #include #include using namespace std;
const int maxn=1e5+5;
int n,m;
long long ans=0;
priority_queuefanvree 很聰明,解決難題時他總會把問題簡單化。 例如,他就整天喜歡把圖轉化為樹。但是他不會縮環,那他怎麼轉化呢? 這是乙個有 n 個點 m 條雙向邊的圖,fanvree 會選定乙個節點,然後刪掉這個節點和這個點連出去的邊, 如果變成了一棵樹,那麼這個節點便是可行的,什麼是樹呢?樹也即無簡單環的無向連通圖。 告訴 fanvree 可能的節點是什麼。
輸入:第一行兩個正整數 n 和 m,表示有 n 個點 m 條邊,保證 n≥2。 接下來 m 行,每行兩個整數 v,u,表示 v 和 u 之間有一條無向邊 1≤v,u≤n,保證沒 有重邊和自環。
輸出:第一行乙個正整數 ns,表示這個圖中有 ns 個結點可選。 接下來一行,共 ns 個整數,每個整數表示乙個可選結點的編號。 請按編號從小到大的順序輸出。 資料保證圖中至少存在乙個可選的結點。
樣例輸入:
6 61 2
1 32 4
2 54 6
5 6樣例輸出:
34 5 6
資料範圍:
對於 40%的資料:n,m<=1000;
另外存在 10%的資料:m=n-1;
考試的時候用的暴力+bfs,即列舉每個被刪除的點,再用bfs檢查是否為樹和連通圖(當然檢查是否是樹的時候用的father陣列胡亂做的)
正解:
很簡單的一道圖論題。
根據題意:
刪除乙個點形成樹必須滿足的條件:
1、刪除這條點後有頂點-1條邊
2、刪除點後依舊為連通圖(即非割點)
重點就是求割點的tarjan
#include #include #include #include using namespace std;
const int maxn=100005;
int n,m,root=1;
vectorg[maxn];
bool cutpoint[maxn];
int dfn[maxn],low[maxn],t;
int edge[maxn],ans[maxn],newp=0;
void init()
}void tarjan(int u)
else low[u]=min(low[u],dfn[v]); }}
int main()
2023年信競說
回顧2020年,有歡笑也有悔恨,更是充實的埋頭苦幹的一年。我是一名資訊競賽生。年初,我算是過了一段比較不錯的日子。在迷糊的假期中忙著聽課 考試 刷題 作業 於是開學了,這一年再也沒有這麼漫長的時光了。ccf推遲了省選,所以還是有一段時間可以複習的。為什麼這麼說呢?寒假的低效學習,根本沒有複習的效果。...
NOIP模擬(11 06)T1 數集
數集 題目背景 11.06 noip 模擬t1 分析 佇列 考慮暴力的想法當然是直接維護乙個堆,每一次取出最小的乙個,然後把 2 x 1,3 x 1 push 進去,但是看看最大資料,1000000 還有10 組資料,這怕不是要死人 於是乎,認真想正解,然後就發現了,顯然,因為每一次取出的數是一次遞...
bzoj 1106 貪心 樹狀陣列 或 棧模擬
題意 n個數,各出現兩次,當兩個相同的數相鄰時,這兩個數同時消除,上方的方塊同時下落且可繼續消除滿足條件的。每次可交換相鄰的兩個方塊,求最少交換次數使得所有數全消除 首先,對於一對相同的數中間有另一對的情況 即兩對相同的數是巢狀關係 肯定要先消除另一對 其次,對於一對相同的數中間有另一對中的乙個的情...