牛客練習賽16 B 漂亮的樹,C 任意點

2021-08-19 13:44:54 字數 2129 閱讀 4905

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

街上有n棵樹,標號為1...n,第i棵樹的高度為a

i。定義這n棵樹是漂亮的,當且僅當

1. 對於所有的i,a

i=an-i+1;

2. 對於1 <= i < n / 2 (不是整除),a

i + 1= a

i + 1;

比如說 「2 3 4 5 5 4 3 2」和「1 2 3 2 1」是漂亮的而「1 3 3 1」和「1 2 3 1」不是。

現在請問最少修改幾棵樹的高度(可以變大也可以變小),使得這些樹是漂亮的。

第一行乙個整數n表示樹的數量( 1 <= n <= 100,000)。

第二行n個整數表示樹的高度( 1 <= ai

<= 100,000)。

輸出乙個整數表示最少修改樹的高度的數目。

解題思路:這個題看著真的很懵,沒有思路一開始,後來也是看的別人的解題草懂的,其實很簡單,就乙個難想到的點就是下標減下標對應的值結果出現的次數最多的值就是要求的不需要改變的元素。答案就是n-不需要改的元素個數。這裡用乙個陣列count來表示下標為i的差值,即a[i]-i,但是因為a[i]-i的值有可能是負數,所以我們考慮到最大的負數為-2*maxn,所以我們這個count陣列平均都加上2*maxn,這樣就避免了負數。

ac**:

#include#include#includeusing namespace std;

int n;

int temp;

const int maxn = 1e5 + 5;

int a[maxn];

int cou[maxn*2]; //用來儲存i-a[i]的個數陣列

int main()

memset(cou, 0, sizeof(cou));

int temp = (n+1) / 2;

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

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

int ma = 0;

for (int i = 1; i <= 2 * maxn; i++)

cout << n - ma << endl;

return 0;

}

c任意點

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。

請問至少需要加多少個點,使得點對之間互相可以到達。

第一行乙個整數n表示點數( 1 <= n <= 100)。

第二行n行,每行兩個整數xi, yi表示座標( 1 <= xi, yi 

<= 1000)。

y軸正方向為北,x軸正方形為東。

輸出乙個整數表示最少需要加的點的數目。

解題思路:其實就是求連通圖的個數。然後加邊使得只有乙個連通圖。bfs廣度優先搜尋,從第乙個點開始進行搜尋,將所有可以連到的點都標記出來,然後求出所有互相不連通的個數,即在n個小連通圖之間加上n-1條邊使得n個小連通圖連通。

ac**:

#include#include#include#include#includeusing namespace std;

const int maxn = 1000 + 100;

int n;

struct node

;vectorvec;

bool f[maxn];

queueq;

void bfs(int x)

}} }

return;

}int main()

memset(f, 0, sizeof(f));

int ans = 0;

for (int i = 0; i < n; i++) }

cout << ans-1 << endl;

return 0;

}

牛客練習賽16 B 漂亮的樹 思維

這道題我第一次寫的時候,我的想法是正著去模擬遍歷最小的變動次數,最後沒寫出來,好像這個思路不太對。正確的方法是反向去思考,我們先得到乙個初始化為題目要求的pre陣列,為了解釋的清楚一點 這裡描述的和 不太一樣 在ans陣列裡輸入n個數,然後我們需要求出對應的第i個數的ans i pre i 的差值的...

牛客練習賽 1 B 樹

有一顆樹,有k種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對 x,y x,y x,y x xx 到 y yy 的路徑上的所有點的顏色都要與 x xx 和 y yy 相同,請統計方案數 易得乙個節點要麼塗和父節點乙個顏色,要麼塗沒有出現過的顏色 假設我們遍歷到了第 x ...

牛客練習賽16C 任意點 並查集

平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。請問至少需要加多少個點,使得點對之間互相可以到達。第一行乙個整數n表示點數 1 n 100 第二行n行,每行兩個整數xi,yi表示座標 1 xi,yi 1000 y軸正方向為北,x軸正方形為東。輸出乙個...