在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 的號碼,主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。請提交該數字 乙...