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...