第六屆藍橋杯省賽C C B組(倒序)

2021-10-08 21:32:20 字數 3571 閱讀 7928

在x森林裡,上帝建立了生命之樹。

他給每棵樹的每個節點(葉子也稱為乙個節點)上,都標了乙個整數,代表這個點的和諧值。

上帝要在這棵樹內選出乙個非空節點集 s,使得對於 s 中的任意兩個點 a,b,都存在乙個點列 使得這個點列中的每個點都是 s 裡面的元素,且序列中相鄰兩個點間有一條邊相連。

在這個前提下,上帝要使得 s 中的點所對應的整數的和盡量大。

這個最大的和就是上帝給生命之樹的評分。

經過 atm 的努力,他已經知道了上帝給每棵樹上每個節點上的整數。

但是由於 atm 不擅長計算,他不知道怎樣有效的求評分。

他需要你為他寫乙個程式來計算一棵樹的分數。

輸入格式

第一行乙個整數 n 表示這棵樹有 n 個節點。

第二行 n 個整數,依次表示每個節點的評分。

接下來 n−1 行,每行 2 個整數 u,v,表示存在一條 u 到 v 的邊。

由於這是一棵樹,所以是不存在環的。

樹的節點編號從 1 到 n。

輸出格式

輸出一行乙個數,表示上帝給這棵樹的分數。

資料範圍

1≤n≤105,

每個節點的評分的絕對值均不超過 106。

輸入樣例:

51 -2 -3 4 5

4 23 1

1 22 5

輸出樣例:

8

利用樹形dp,應該是樹形dp吧hh。

f[u]表示的是以u為根節點的子樹的最大分數。

f[u]=w[u]+f[j] j表示子結點 f[j]需要大於0,否則就不要

對樹進行一遍dfs,dfs的過程中求解即可。

#include#includeusing namespace std;

typedef long long ll;

const int n = 100010,m = 2*n;

int h[n],e[m],ne[m],w[n],idx;

int n;

ll f[n];

void add(int a,int b)

void dfs(int u,int father) }}

int main()

dfs(1,-1);

ll ans = f[1];

for(int i=1;i<=n;++i)

ans = max(f[i],ans);

cout《這個題目比較難,我也講不清楚。簡單說一下知識點。

首先我們考慮dp f[i][j]為壘i個骰子,第i個骰子j點朝上的情況數。如果一層一層求,鐵定超時。

那麼這個時候考慮矩陣乘法,尋求f[n][i]和f[n+1][j]的關係(這樣表示似乎不對,就是第n層的六面和第n+1層的六面的關係),這個時候就可以找到關係矩陣a。然後由於排斥的組數,把某些位置改為0即可。

快速矩陣乘。

#include#includeusing namespace std;

typedef long long ll;

const int n = 6,mod = 1e9+7;

int f[n][n];

int a[n][n];

int get_op(int x)

void mul(int c[n],int a[n],int b[n])

; memset(t,0,sizeof t);

for(int i=0;i>n>>m;

for(int i=0;i>x>>y;

x--;y--;

a[x][get_op(y)]=0;

a[y][get_op(x)]=0;

} for(int i=0;i>=1;

mul(a,a,a);

} ll res = 0;

for(int i=0;i把編號變為0 1 2 3…

然後處理x,y座標

#include#includeusing namespace std;

int w,m,n;

int main()

if(n==13||m<0)

for(int i=0;i<=4;++i)

dfs(n+1,m-i);

}int main()

void f(int x, int k)

for(i=k; i<9; i++)

f(x,k+1);

t=x[k]; x[k]=x[i]; x[i]=t;// 填空處 }}

int main()

; f(x,0);

return 0;

}

t=x[k]; x[k]=x[i]; x[i]=t;

stringingrid函式會在乙個指定大小的格仔中列印指定的字串。

要求字串在水平、垂直兩個方向上都居中。

如果字串太長,就截斷。

如果不能恰好居中,可以稍稍偏左或者偏上一點。

下面的程式實現這個邏輯,請填寫劃線部分缺少的**。

複製貼上;讀**;填空,執行正確;完成。

printf("%*s",10,「abc」) 表示以10寬度來顯示abc

我們可能知道scanf裡用*修飾符,是起到過濾讀入的作用。比如乙個有三列數值的資料,我只想得到第2列數值,可以在迴圈裡用scanf(「%*d%d%*d」, a[i])來讀入第i行的第2個數值到a[i]。 

但是* 修飾符在printf中的含義完全不同。如果寫成printf(「%6d」, 123),很多童鞋應該就不會陌生了,這是設定域寬的意思。同理,%6s也是域寬。* 修飾符正是用來更靈活的控制域寬。使用%*s,表示這裡的具體域寬值由後面的實參決定,如printf(「%*s」, 6, 「abc」)就是把」abc」放到在域寬為6的空間中右對齊

#include #include void stringingrid(int width, int height, const char* s)

;bool isleap(int x)

int modify(int x)

if(month>12)

return year*10000+month*100+day;

}int main()

printf("%04d-%02d-%02d",ans/10000,ans%10000/100,ans%100);

return 0;

}

2017-08-05

有些人很迷信數字,比如帶「4」的數字,認為和「死」諧音,就覺得不吉利。

雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某**活動的獎券號碼是5位數(10000-99999),要求其中不要出現帶「4」的號碼,

主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。

請提交該數字(乙個整數),不要寫任何多餘的內容或說明性文字。

#includeusing namespace std;

bool check(int x)

return true;

}int main()

cout

}

藍橋杯第六屆省賽C C B組個人題解

直接暴力 答案 52488 include using namespace std intmain t 10 if ok ans cout excel填一下 2017 8 5 這題有意思了 可以用數學直接推出來 首先三必定是1,祥 1 10 羊 1 進製情況 1 有進製的情況 祥 10 羊 不成立 ...

第六屆藍橋杯試題c c B組4

格仔中輸出 stringingrid函式會在乙個指定大小的格仔中列印指定的字串。要求字串在水平 垂直兩個方向上都居中。如果字串太長,就截斷。如果不能恰好居中,可以稍稍偏左或者偏上一點。下面的程式實現這個邏輯,請填寫劃線部分缺少的 include include void stringingrid i...

第六屆藍橋杯省賽試題B組

獎券數目 有些人很迷信數字,比如帶 4 的數字,認為和 死 諧音,就覺得不吉利。雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某 活動的獎券號碼是5位數 10000 99999 要求其中不要出現帶 4 的號碼,主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。請提交該數字 乙...