題意:給出n對數,對於每一對,其中如果有沒有選過的數那麼就可以選,就可以選擇那乙個數,ans++。需要求最大的ans
思路:隊友很強,思路秒出,十分鐘**,一發ac可以把這些數對想成一條邊上的兩個點,可以想像一下如果我要最多的選擇這上面的點,假如這些點構成的邊是一棵樹的話,我們最多在這n個點中能選擇的只有n-1個點。如果有成環的話,不論是什麼環,都可以讓這n個點都選得到,畫乙個圖看一看就很清楚了。資料需要離散化一下,然後用並查集來儲存這些連通圖,增加乙個判斷是否有環、連通圖大小的的陣列,不斷維護就可以了。
#include
using
namespace std;
int _, n, cas;
map <
int,
int> mp;
bool huan[
200005];
int fa[
200005
], siz[
200005];
intfind
(int x)
intmain()
else
}long
long ans =0;
for(
int i =
1;i <= now; i++
)printf
("case #%d: %lld\n"
,++cas, ans);}
}
題意:給n道菜的利潤,還有每道菜的庫存。每個客人每道菜最多只能吃一盤,並且必須從第一道菜開始吃,之後如果要繼續吃,必須是連續的菜,比如吃完第一種菜,想吃第二盤的話就必須吃第二種。求最多可以招待多少個客人,並且求出客人最多的情況下的最大利潤。
思路:字首和求出菜的利潤,可以知道最大招待客人的數量就是第一道菜的份數,所以在處理b陣列的時候可以往後取min,比如樣例中 4 2 1 2經過處理就變成 4 2 1 1,把無效的資料抹掉。拿第二個樣例舉例經過上述變換之後資料為
3 1 4 2
4 2 1 1
當四個人只吃第乙份食物時可以賺12元,然後往後看第二份食物,分多少個吃到第二份很虧,因為吃的又多還沒得只吃第乙份賺的多,再看第三份,把只吃第乙份的人分乙個吃到第三份來,就是 3∗3
+4∗1
=13
3*3+4*1=13
3∗3+4∗
1=13
的利潤了,再往後吃就又沒有當前賺了。
由這個步驟我們可以知道,在往後遍歷時,如果有比之前最大的利潤更大的時候我們就可以盡量選擇這個更大利潤的菜來吃,又因為有庫存的限制因素,那麼就把之前的人減去這個更多的庫存,加到最終利潤裡面就可以了。 利用單調棧來處理這個題。對了,這題的資料範圍爆 long long了,需要使用__int128來儲存答案。
#include
using
namespace std;
int _, n;
long
long a[
100005
], b[
100005];
stack long
long
,long
long
>
> sta;
inline
void
write
(__int128 x)
if(x>9)
write
(x/10);
putchar
(x%10
+'0');
}int
main()
b[0]
=1e9
;for
(int i =
1;i <= n; i++)
sta.
push
(make_pair
(a[1
], b[1]
));for
(int i =
2;i <= n; i++)}
else sta.
push
(t);}
__int128 ans =0;
while
(!sta.
empty()
)printf
("case #%d: %lld "
,++cas, b[1]
);write
(ans)
;puts(""
);}}
2020牛客暑期多校訓練營(第八場)
總結 這次做的不好,爆零了,雖然確實本場題比較難,但是沒做出來確實問題很大,考慮問題不夠全面仔細。kg 待定給出n對數字a,b。有三種操作。第一種,什麼也不做。第二種,如果ai在在前面沒有被選過,可以選擇ai。第三種,如果bi在前面沒有被選過,可以選擇bi。求最多可以選擇多少種不同的數字。對數字進行...
2020牛客暑期多校訓練營(第八場)
題目鏈結 a all star game 題意 有n個運動員與m個球迷,現給你n個運動員各自的球迷編號,現在問你若要m名球迷都看比賽,至少需要多少名運動員上場?滿足球迷看比賽的條件 1 該球迷喜歡的運動員有上場 2 球迷i與球迷j都有相同的喜歡球員,則球迷j喜歡運動員k,則球迷i也喜歡運動員k 然後...
2020牛客暑期多校訓練營(第八場)
目錄傳送門 solvedab cdef ghij k5 11o o o o o對時間分治,線段樹維護可撤銷並查集的模板題。這樣可以直接維護每乙個時刻的連通性,我們只需要求出當前連通塊的個數 雙方孤立的點數即可得出答案。所以在增 添邊時維護一下點的度數和孤立點數即可。code author heyuh...