題解 關於新生賽部分題目的

2021-09-02 00:15:04 字數 1856 閱讀 7206

題目傳送門

題目是個圓,弱弱的問一句有存圓的資料結構或型別嘛?呃,看成一條直線不就行。

題目資料量感人,我能不能o(n^3)解決?emm....

我的思路:

1.首先既然能構成等邊三角形,那麼必然,三個點是要平分整個圓的。也就是說只要存在一組三個點他們之間的距離都是三分之一圓弧就行,也就是周長的三分之一。

2.把乙個圓找個位置切開,然後拉成一條直線,然後把題目給我們的每乙個圓上的點都在這條虛擬的直線上標記一下順便記錄每個點的座標,那麼如果我們能找到三個點座標之差都為三分之一圓弧就好了。

3.問題在於怎麼把虛擬的直線給存下來(用map)

為什麼用map,一般標記東西不是直接用陣列嘛?因為這裡直線可能過於長,陣列會直接**,(現場的時候我就沒想到用map,賽完康哥給我提示一下,我恍然大霧,你說你真是的,為啥不在現場賽的時候給我個眼神提示我一下呢?差評!哈哈emm…)我們這裡開乙個map記錄一下直線上的哪個座標被標記了 這樣操作map< long long bool> m;

這裡貼上ac**,速度一般,還有很大的優化潛力。沒朋哥快,但是比林姐快多了(逃…)

#include

#include

using

namespace std;

map<

long

long

,int

>m;

int n;

long

long ll;

long

long p;

long

long a;

long

long x[

1000006];

intmain()

if(ll %3!=

0)else}if

(ok)

cout<<

"yes"

;else cout<<

"no";}

return0;

}

emm,這縮排有問題…

提示1:關於周長不能被3整除的特判,朋哥給最先發現的,然鵝oj資料並沒有類似的資料,加不加都給過了,但最好加上,想一想為什麼?

假設三分之一弧長為3,周長為9,我們依次判斷每個點

從座標為1的點開始,(1,1+3,1+6);(2,2+3,2+6);(3,3+3,3+6);(4,4+3,4+6)到這裡你會發現4+6已經超過周長9,

但是你想一下超過周長的我們必定要從頭開始就會變成(4,4+3,4+6-9)也就是(4,4+3,1)換換數字位置也就是(1,4,7)看之前已經判斷過(1,1+3,1+6)了也就是(1,4,7)

本題我跑出50毫秒,其實可用二分搜尋,速度又有質的提高(朋哥10毫秒)另外還有林姐故意測試oj承受能力的1500毫秒的神奇解法,大家可以多多摸索

題目傳送門

#include

using

namespace std;

int a[

1000];

//這個陣列記錄質數

int b[

1000];

//這個陣列記錄質數的指數

intmain()

for(

int i=

1;i<=n;i++)if

(g==1)

else

return0;

}

五校新生友誼賽(部分題解)

f題 原題 傳送門 題意 如題目,從乙個棋盤的右上角 1,m 每次可以往左,下,左下移動,誰不能移動誰就輸了。思路 先可以從小範圍入手,1x1時先手必敗點,一行或者一列的時候奇數點先手必敗。如3x3的圖 l 先手必敗 w 先手必勝lw lwww lwl能看出規律當n與m為奇數的時候先手必敗。可畫大些...

2015新生賽題目

time limit 1 sec memory limit 128 mb submit 66 solved 13 submit status web board 實驗室有n個座位,原本編號為1 n。現在zero將所有座位重新編號。zero想知道對於給定的數字p,是否存在某個座位的新編號為p,或者某些...

20161108新生賽題解

20161108新生賽題解 lolizlm的數字 include include include int max int x,int y if x y return x return y int min int x,int y if xreturn y int main int n scanf d ...