2020 07 05 熱身訓練賽(五)

2022-04-01 10:39:45 字數 3020 閱讀 9979

a.(gym-12483a)

b.(gym-12483b)

題意:給出乙個樹,要求寫出每個節點的座標,使得相鄰節點之間的距離為1,並且任何一對節點之間的距離最少為$10^$,相鄰節點之間的距離與1的絕對誤差最多為$10^$,不連線在同一節點的邊之間的距離至少為$10^$,座標的絕對值不超過$3000$。

解:分配邊轉化為分配角度$\theta$,那麼點的座標就是$(x+cos\theta,y+sin\theta)$,為了避免交叉,利用樹的結構進行dfs,角度按照dfs的順序增大,這樣就可以保證邊不重疊了,實際上不用刻意的研究$10^和10^$,可以認為這兩個數字就表示無窮小,也就是點重疊,邊交叉的情況。比賽的時候沒認真考慮邊交叉,就用了bfs,後來隊友也寫了乙個,寫的dfs,但也wa了。賽後去看了一下別人的**,才突然意識到這個問題。隊友寫的dfs我也看了一下,發現裡面出了乙個極小無比的錯誤,改掉就過了。

#include#include

#include

#include

#include

#define maxn 1001#ifndef m_pi

#define m_pi 3.14159265358979323846

#endif

using

namespace

std;

intnum,head[maxn];

struct

nodee[maxn*2

];void insert(int

from,int

to)struct

pointp[maxn];

intn;

double

eps;

bool

vis[maxn];

int cnt=-1

;void dfs(int

now)

}}int

main()

p[1].x=0;p[1].y=0

; vis[

1]=1

; dfs(1);

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

return0;

}

d.(gym-12483d)

e.(gym-12483e)

f.(gym-12483f)

題意:在乙個平面上有乙個小球,許多障礙物和乙個洞(洞的座標為(0,0)),將平板向乙個方向傾斜,就可以使小球向這個方一直滾動,直到遇到障礙物或者進洞。題目給出乙個包含lrud的字串,表示平板傾斜的方向序列,要求根據這個序列設計一種障礙物的擺放方法,使小球最後能順利進洞,不能滿足條件的輸出impossible。

解:規定小球從(0,0)開始滾動,最後根據最終的位置應該在(0,0),把所有的點進行平移。可以先判斷能夠產生impossible的情況,impossible實際上就是中途進洞,因為最後一步移動要把小球移動到洞裡,所以如果有lrl,rlr,udu,dud這四種情況出現在最後三次操作中,就直接輸出impossible了。求路徑時,如果有rlrl這類情況,就可以只設定左右兩個障礙,如果出現ru這類情況,就把小球向u移兩格,設定新的障礙。

#include#include

#include

#include

#define maxn 10010

using

namespace

std;

char s[21

];int

n,cnt;

bool

flag;

struct

node

bool

operator

< (const node u)const

}ans[maxn];

intmain()

if(flag)

int d=1

;

int x=0,y=0

;

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

}if(s[i]=='l'

); }

if(s[i]=='u'

); }

if(s[i]=='d'

); }

if(i+1

<=n)

}printf(

"%d %d\n

",-x,-y);

sort(ans+1,ans+cnt+1

); n=unique(ans+1,ans+cnt+1)-ans-1

; printf(

"%d\n

",n);

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

return0;

}

題意:一共有n個位置,可以填入0或1,如果相鄰兩個數字不同,就稱為有乙個change,題目中指定b個位置只能為0(約定第乙個位置不指定,最後乙個位置指定),其它位置填0或者1,使得恰好有c個change,要求寫出一種符合要求的01串。

解:可以發現如果在兩個0之間填1,無論如何都會增加偶數個change,而如果在第乙個位置填了1,那麼無論如何都會增加奇數個1。所以可以通過c的奇偶性來判斷第乙個位置應該填的數。然後根據剩下的需要滿足的change數,來順次填不一樣的數字。

#include#include

#include

#define maxn 500010

using

namespace

std;

intn,c,b,a[maxn];

intmain()

if(c%2==1)

else a[1]=0

;

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

if(a[i]!=a[i-1])c--;

if(c<=0)break

; }

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

puts(

"");

return0;

}

i.(gym-12483i)

j.(gym-12483j)

k.(gym-12483k)

2020 07 04 熱身訓練賽(四)

a.gym 101992a 題意 給出乙個長度為n的序列,只能對其施加新增乙個數字和刪除乙個數字的操作,求最少需要多少次能把序列變成1 p的排列 p不知道 解 列舉p,求最小值 include include include using namespace std intt,n,ans mapp i...

暑假訓練賽五

time limit 1 sec memory limit 128 mb submit 88 solved 38 submit status web board tomcat 是一次單身cat,但是他有著很多的 每次吃飯都會qq他的某乙隻 然而,他的 jerry 總是很墨跡。等待是無聊的,這時tom...

訓練 9 13 訓練賽

a.hdu 6230 乙個合法的子串 s 3n 2 滿足條件即1 2n 1 為以n為回文中心的回文串,n 3n 2為以2n 1為中心的回文串。故我們可以通過尋找回文中心對,來判斷相應合法子串的個數。利用manacher求出每個位置的最長回文半徑,則若i,j滿足條件 i j 則應有 p i geqsl...