題目鏈結
題意:給出一棵有n(n≤10 000)條邊的樹,存在且僅存在乙個critical結點,使得刪除該critical結點後,不連通的結點對最多。①求出刪除該critical結點後不連通的結點對的數量n1。
②在刪除critical結點後加一條最優的邊,使得恢復連通的結點對最多,同時求出加上該最優邊後依舊不連通的結點對的數量n2。
比賽時寫的並查集+帶判斷的暴力刪點[accept]思路:暴力列舉與最大度數相差range以內的點為刪點,對剩下的點用帶權並查集求不連通的節點對數量。結果取所有列舉的max
!非正解,range試了幾次,取100時tle,取1時wa,取10時ac
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define inf 0x7fffffff
typedef
long
long ll;
const
int n=
11000
;int l[n]
,r[n]
,n,all,n1,n2,du[n]
,fa[n]
;int siz[n]
,st[n]
,cnt,n1_,n2_;
intfind
(int u)
intmain()
int id=0;
for(
int i=
1;i<=n;i++)if
(du[i]
>du[id]
)id=i;
all=n*
(n-1)/
2;for(
int k=
0;k<=n;k++
)else
continue
;for
(int i=
1;i<=n;i++)}
}int sum=0;
for(
int i=
0;i<=n;i++)}
n1=all-sum;
sort
(st+
1,st+
1+cnt)
; sum-
=st[cnt]
*(st[cnt]-1
)/2+st[cnt-1]
*(st[cnt-1]
-1)/
2;sum+
=(st[cnt]
+st[cnt-1]
)*(st[cnt]
+st[cnt-1]
-1)/
2;n2=all-sum;
if(n1>n1_)
} cout<" "<}
正解思路:因為是n+1個點n條邊的連通圖,所以任取一點為根把圖轉化為樹,dfs求出每個節點的每個子節點的size,當前點到根那一邊的連通分量大小為n+1-∑size[all_son]。求出最大n1,再使刪除當前點後的兩個最大連通分量連通,計算n2。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef
long
long ll;
const
int n=
11000
;int n,fa[n]
,siz[n]
,n1,n2,id,son[n]
,cnt;
vector<
int>v[n]
;void
dfs(
int k)
}int
main()
dfs(0)
;for
(int i=
0;i<=n;i++)}
son[
++cnt]
=n+1
-siz[id]
;for
(auto
&j:v[id])if
(j!=fa[id]
)son[
++cnt]
=siz[j]
;sort
(son+
1,son+
1+cnt)
; n2=n1-son[cnt]
*son[cnt-1]
; cout<" "<}
思路:先根據題意,每x天的飯量取值只能為m*[(2/3) ^ x],x取值為0,1,2…n,所以我們可以先把每天飯量的可能取值求出來,存進陣列e裡。然後定義dp[i][j]表示第i天,飯量為e[j]時,吃掉的食物總量。
先把初始值設為-1,表示未賦值。然後讓dp[i][0]全等於0,表示一直不吃的情況。
然後分類討論:
今天吃完後的分值為dp[i][j]+min(e[j],a),記為aftereat
· 今天吃,明天也吃:dp[i+1][j+1]=max(dp[i+1][j+1],aftereat)
· 今天吃,明天不吃,後天吃:dp[i+2][j]=max(dp[i+2][j],aftereat)
· 今天吃,明天不吃,後天也不吃,大後天吃:dp[i+3][0]=max(dp[i+3][0],aftereat)
#include
using namespace std;
typedef
long
long ll;
const
int n=
107;
int n,m,dp[n]
[n],e[n]
;int
main()
}int ans=0;
for(
int j=
0;j<=n;j++
) ans=
max(ans,dp[n+1]
[j])
; cout
}
2020 01 18涼脾比賽
題目鏈結 題意是 給你一串字串 偶數個 1.首先把這個字串劃分為兩半,設為x,y。2.計算x字串中的每乙個字元對應的序號並相加和為sum,然後x中的每個字元變為加上這sum後對應的字元,y字串操作同理。3.第二步操作後的x字串中的每個字元要加上對應的y字串中的每個字元對應的序號。include in...
涼脾的比賽題解
題意給定乙個字串,字串的長度一定是偶數,首先先把字串分成長度相等的前後兩部分,然後對這兩個字串做相同處理,處理規則是,先求字串的總數和,總數和的求法就是字串中的所有字母減a加起來 比如abcd總數和就是0 1 2 3 6,知道了總數和,字串中的每個字母都加上總數和,假設總數和是6,a就變成了g,z變...
涼心的比賽 一 補題
題目鏈結 題意 有n個物品,能進行a次操作一和b次操作二,每個物品有乙個hp和damage,操作一為把某個物品的hp變為原來的兩倍,操作二為把某個物品的hp賦值給它的damage,問這n個物品的damage的總和最大是多少。思路 證明出來a操作應該都使用給同乙個物品最優,然後按b操作的最優方案排序,...