牛客練習賽59 A B C D

2021-10-03 20:49:58 字數 3102 閱讀 4116

題目鏈結

a - 小喬和小灰灰

題意:求給定字串中是否出現「xiaoqiao」和「xiaohuihui」

思路:兩次遍歷,將「xiaoqiao」和「xiaohuihui」定義為兩個模式串,在給定字串中找到相應字元繼續往後推,看最後模式串的下標大小就知道是否為子串行了。

#include

using

namespace std;

string s;

intmain()

if(j == len1) ok1 =1;

j =0;

int len2 = t2.

length()

;for

(int i =

0;i < n; i++)if

(j == len2) ok2 =1;

if(ok1 && ok2)

puts()

;else

puts

("emm");

}

b - 牛能和小鎮

題意:給n個座標,根據題給的距離費用公式求出需要連線所有點的最小花費。 公式:| xi

2yi - xj

2yj + yi

2(yi - 2xi) - yj

2(yj - 2xj) |

思路:公式可以變形一下就比較直觀:

|( xi

2yi + yi

2(yi - 2xi) )- ( xj

2yj + yj

2(yj - 2xj) ) |

這樣就可以看出來是兩個點各自的座標經過運算後作差。需要最小的差值,那麼排序之後再逐個作差就好了。

#include

using

namespace std;

long

long x[

100005

], y[

100005

], len[

100005];

int n;

intmain()

sort

(len+

1, len+

1+n)

;long

long ans =0;

for(

int i =

1;i < n; i++

)printf

("%lld\n"

, ans)

;}

c - 裝備合成

題意:乙個裝備需要a、b兩種材料合成,2個a 3個b 或者 4個a 1個b 都可以,求給定a和b的個數時最多可以合成多少裝備。

如果x : y >= 4 : 1,那麼全部使用第二種方案

如果x : y <= 2 : 3,那麼全部使用第一種方案

介於之間的就優先使用 2 : 3 的方案直到 x : y = 4 : 1,那麼就需要計算需要多少次 2:3的操作就有:

變形一下:

n的值或許會取小數,又可能是第一種方法多乙個,也有可能第二種方法多乙個,此時四捨五入一下就可以得到:

#include

using

namespace std;

int _;

long

long x, y;

intmain()

elseif(

(double

)x/(

double

)y <=

(double)2

/(double)3

)else

}}

d - 取石子遊戲

題意:xiaoqiao和xiaohuihui兩個人從石堆裡面拿石子,每次把石子分成兩部分,乙個從中拿走一部分,另乙個繼續把剩下的分為兩部分,再拿走其中的一部分。石堆如果是偶數的話就平均分,不為偶數就有一堆可以多出乙個。當其中乙個人準備拿石子時只剩下乙個,那麼這個人就輸了,求兩個人中誰會贏。(xiaohuihui先手)

思路:博弈的話先找找規律:

1個石子的時候肯定是後手贏;

2個石子的時候,先手拿走1個,剩下1個,所以先手就贏了;

3個石子分為 1 和 2, 先手拿走2個,剩下乙個,先手贏;

4個石子分為 2 和 2,先手拿走兩個,此時,可以看成先手變為後手,2個石子的情形,顯然是2個石子的先手贏,也就是本局的後手;

5個石子分為 2 和 3,先手拿走哪乙個之後剩下的都是對照前面的 2 和 3,得出本劇後手贏

就這樣一直推可以得出乙個結論,石堆一分為二之後,兩堆石子對應之前有後手贏的時候,本局先手才可以贏,否則後手贏。

看資料範圍之後這樣一直遞推肯定超時,那麼就想如果可以知道給定的n屬於先手贏還是後手贏的範圍,直接查詢的話就會快很多,在常數級就可以得出答案。

看前面幾個樣例,2和3 是先手贏,4、5、6是後手贏的範圍,4 = 2+2,6 = 3+3, 5 = 2+3;

再看後面的: 7 - 13是先手的範圍:7 = 3+4,9 = 4+5, 11 = 5+6, 13 = 6+7; 8 = 4+4, 10 = 5+5, 12 = 6+6;規律應該就很顯然了,從已知的範圍可以求出後面的範圍,比如4、5、6三個數逐個相加的個數為6-4=2; 各自相加的個數為6-4+1=3;那麼後面的範圍就是2+3=5,這樣就可以預處理 1e18之內的先後手贏的範圍,之後輸入時查詢就可以了。

#include

using

namespace std;

const

long

long n =

1e18

;vector long

long

,long

long

>

> vc;

int _;

long

long n;

intmain()

scanf

("%d"

,&_)

;while

(_--)}

}}

牛客練習賽59做題心得

題目鏈結 這道題有很多種做法,我在這裡採用的是動態規劃的方法。我們可以讓原字串和xiaoqiao,xiaohuihui。這裡是我的部落格,有興趣的朋友可以關注一下。include include include include include using namespace std const in...

牛客練習賽59 B 牛能和小鎮

題目描述 在牛國有2個小鎮編號1,2,3.n 1,n。用二維平面來表示每個小鎮的位置,第個小鎮的位置為 xi,yi 牛能做為牛國的國王,決定給小鎮之間建設一些道路,以便於任意小鎮之間都能相互到達,在第個小鎮和第個小鎮之間建設一條道路的花費是 xi xi yi xj xj yj yi yi yi 2 ...

牛客練習賽9

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...