兩道磨人的ACM類比

來源:互聯網
上載者:User

UESTC ACM OJ 1004和1008

 

8球勝負(eight)

 

Time Limit: 1000 ms Memory Limit: 65535 kB
Solved: 440 Tried: 1910

 

Description8球是一種撞球競賽的規則。檯面上有7個紅球、7個黃球以及一個黑球,當然還有一個白球。對於本題,我們使用如下的簡化規則:紅、黃兩名選手輪流用白球擊打各自顏色的球,如果將該顏色的7個球全部打進,則這名選手可以打黑球,如果打進則算他勝。如果在打進自己顏色的所有球之前就把黑球打進,則算輸。如果選手不慎打進了對手的球,進球依然有效。
現在給出打進的球(白球除外)的順序,以及黑球由哪方打進,你的任務是判定哪方是勝者。
假設不會有一杆同時打進一顆黑球和其他綵球。 

 

Input

輸入包含多組資料。每組資料第一行是一個整數N(1<=N<=15),表示打進的球的個數,N=0表示結束。隨後有一行,包含N個字元,依序表示打進的是何種球。如果是’B’,表示是紅方打進的黑球,如果是’L’,表示是黃方打進的黑球。如果是’Y’則表示是黃球,’R’表示紅球。字元間沒有空格。
所有輸入都滿足如下條件:最後一顆球打進時這局比賽正好結束,而且打進的紅球和黑球都不超過7個。

 

 

Output對每組資料,輸出一行。如果紅方勝,輸出’Red’;黃方勝,輸出’Yellow’。 

 

Sample Input5
RYRRB
9
RRRRYRRRB

 

Sample OutputYellow
Red 

 

Source電子科技大學第六屆ACM程式設計大賽 初賽 補兵(kill)

Time Limit: 1000 ms Memory Limit: 65535 kB
Solved: 17 Tried: 335

Description在非常流行的DOTA遊戲中,補兵是非常重要的一種技術統計。如果一個單位被對方的多個單位攻擊至死,則對該單位造成最後一次(致命的)傷害的攻擊者將會獲得更多的獎勵(金錢和經驗),這名攻擊者被記錄一次補兵。
現在假設有多個人攻擊對方的一個單位,而你是其中的一個,你並不想在前面出手攻擊,而只想打一次就直接將對方打死,完成一次補兵。假設其他人每次攻擊的傷害和每兩次攻擊之間的間隔都是固定的,而你的攻擊傷害也是固定的。輸入將給出每個人兩次攻擊之間的間隔時間,並假設每個人第一次攻擊的時刻值就是他的兩次攻擊之間的時間間隔值。例如,一個人攻擊間隔為2,則他會在時刻2、4、6、8……進行攻擊。
時間以整數計算。
如果多個人同時攻擊導致對方死亡,攻擊傷害最大的那個被記錄一次補兵。如果你是攻擊傷害最大的之一(還有其他和你攻擊傷害一樣的,但沒有更大的),則你被記錄一次補兵。
一個單位血量小於等於0就被判為死亡。
你的任務是求出合適的攻擊時間段,使得這次補兵能夠完成。這個時間段一定是一個區間,你需要輸出的是它的兩個端點。 

Input

輸入包含多組資料。每組資料第一行是一個整數N(2<=N<=1000),表示攻擊對方某個單位的人數。N=0表示輸入結束。接下來有N-1行,每行兩個整數,分別表示每個人每次攻擊的傷害A(1<=A<=10),以及每兩次攻擊之間的間隔T(1<=T<=100)。最後有一行包含兩個整數,分別表示你的攻擊傷害P(1<=P<=100000)以及對方單位的血量H(P<H<=1000000)。

 

Output對每組資料,輸出一行,如果不能完成補兵,輸出’Impossible’,否則輸出最早可以完成補兵的時間和最晚可以完成補兵的時間,用空格間隔。 

Sample Input2
2 2
3 10
2
20 2
3 10

Sample Output8 10
Impossible 

Hint輸入資料較多,盡量用scanf和printf代替cin和cout 

Source電子科技大學第六屆ACM程式設計大賽 初賽1004我暫時的解答是(還未通過):#include <stdio.h><br />int main(void)<br />{<br /> int n, cnt, ball_cnt, f_cnt;<br /> int flg[15];<br /> char g[16];<br /> int w_cnt = 0;<br /> while (scanf("%d", &n) && !n);<br /> {<br /> for (cnt = 0; cnt < n; cnt++)<br /> {<br /> scanf("%c", &g[cnt]);<br /> }<br /> getchar();<br /> ball_cnt = 0;<br /> if (g[n - 1] == 'B')<br /> {<br /> for (cnt = 0; cnt < n; cnt++)<br /> {<br /> if (g[cnt] == 'R')<br /> ball_cnt++;<br /> }<br /> if (7 == ball_cnt)<br /> flg[w_cnt] = 1;<br /> else flg[w_cnt] = -1;<br /> }<br /> else<br /> {<br /> for (cnt = 0; cnt < n; cnt++)<br /> {<br /> if (g[cnt] == 'Y')<br /> ball_cnt++;<br /> }<br /> if (7 == ball_cnt)<br /> flg[w_cnt] = -1;<br /> else flg[w_cnt] = 1;<br /> }<br /> w_cnt++;<br /> }<br /> for (f_cnt = 0; f_cnt < w_cnt; f_cnt++)<br /> {<br /> if (1 == flg[f_cnt])<br /> puts("Red");<br /> else puts("Yellow");<br /> }<br /> getchar();<br /> getchar();<br /> return 0;<br />}<br /> 1008的代碼(未通過):#include <stdio.h><br />int main(void)<br />{<br /> /*各個英雄的攻擊力,攻擊間隔*/<br /> int a[1000], t[1000];<br /> /*計時,攻擊力,第n秒所受傷害,while()計數器,for()計數器<br /> *參與攻擊英雄總數,被攻擊單位hp,計數器,time_start的標記符<br /> */<br /> int time, atck, all, w_cnt, f_cnt, n, hp, cnt, flg, flgsub;<br /> int time_start[80], time_end[80];<br /> scanf("%d", &n);<br /> w_cnt = 0;<br /> while (n != 0)<br /> {<br /> for (cnt = 0; cnt < n - 1; cnt++)<br /> {<br /> scanf("%d%d", &a[cnt], &t[cnt]);<br /> }/*end of for (cnt = 0; cnt < n; cnt++)*/<br /> scanf("%d%d", &atck, &hp);<br /> /*攻擊過程判斷及計算*/<br /> for (time = 1, flg = time_start[w_cnt] = time_end[w_cnt] = flgsub = 0; ; time++)<br /> {<br /> all = 0;/*第n秒受到攻擊置零*/<br /> /*計算第n秒攻擊所受傷害*/<br /> for (cnt = 0; cnt < n; cnt++)<br /> {<br /> /*判斷第(cnt+1)個英雄在第n秒進行攻擊*/<br /> if ((time % t[cnt]) == 0)<br /> {<br /> if (atck < a[cnt])<br /> {<br /> flgsub = 1;<br /> }<br /> all += a[cnt];<br /> }/*end of if (!(time % t[cnt]))*/<br /> }/*end of for (cnt = 0; cnt < n; cnt++)*/</p><p> /*計算第n秒後的hp*/<br /> hp -= all;<br /> /*加上主角的攻擊後,判斷被攻擊單位是否死亡*/<br /> if ((0 == flg) && (flgsub == 0) && (hp <= atck))<br /> {<br /> time_start[w_cnt] = time;<br /> flg = 1;/*以後將不再進入該if()*/<br /> }/*end of if ((0 == flg) && (hp <= atck))*/<br /> /*進入攻擊時間區間後,計算攻擊時機的結束*/<br /> if ((1 == flg) && (1 == flgsub) && (hp <= atck))<br /> {<br /> time_end[w_cnt] = time - 1;<br /> }/*end of if ((1 == flg) && (hp <= atck))*/<br /> }/*end of for (time = 0; ; time++)*/<br /> w_cnt++;<br /> while(getchar() != '/n')<br /> continue;<br /> scanf("%d", &n);<br /> }/*end of while (!n)*/<br /> for (f_cnt = 0; f_cnt < w_cnt; f_cnt++)<br /> {<br /> if (time_start[f_cnt] != 0)<br /> {<br /> printf("%d %d/n", time_start[f_cnt], time_end[f_cnt]);<br /> }<br /> else printf("Impossible/n");<br /> }<br /> return 0;<br />}<br /> 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.