NOIP2002 提高組 複賽 均分紙牌

2021-07-25 21:14:12 字數 1324 閱讀 9100

noip2002 提高組 複賽 均分紙牌

1.看完題,第一想法就是,算出均分後的紙牌張數,與每個位置紙牌數作差,統計負的數個數,與正的數個數,取其中最大個數,即為最少移動次數,當然此種做法估計無法ac,但猜測能拿50分左右,沒有其他想法的時候,就按這個辦法試試吧。

2.提交,5組資料,通過2組,得分40,還算滿意。

3.仔細想了想,這個思路的問題,大方向是對的,問題在於,可能負數與整數間有間隔0,那就要多移動相應0的個數,怎麼考慮有0間隔呢?

4.該題還真是難在演算法,感覺有小學奧數的味道。

5.還有,乙個正數補負數不夠,還需要其他正數幫忙,感覺此題情況比較多啊。看開一看題目定下的策略還是不錯的。

6.搜尋介紹得比較好,

思路:這題是乙個純模擬題,因為牌的總張數是堆的倍數,所以排好序後每隊的張數就是總張數的每堆平均數(總張數÷堆數),則只需模擬一下移動的過程即可:

①從前往後掃瞄陣列,判斷距離平均數還差幾張,如果小於平均數,則用後面那張補過來,如果大於平均數,則往後補

②這題可以不用排序,從前往後模擬即可,不要看題目中給的例子,那過程和我的完全不一樣而且更難理解

7.本人用的就是上述思想,提交ac.學到一招,純模擬

難度:想不到,很難

難度:想到,簡單。

附上ac**,編譯環境dev-c++4.9.9.2

//2002 jfzp2

#include

int a[100+10];

int main()

v/=n;

step=0;

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

}printf("%d\n",step);

return 0;}

附上40分**,編譯環境dev-c++4.9.9.2

//2002 均分紙牌

#include

int a[100+10];

int b[100+10];

int main()

v/=n;

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

zcount=0;

fcount=0;

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

if(b[i]>0)

zcount++;

else if(b[i]<0)

fcount++;

if(zcount>=fcount)

ans=zcount;

else

ans=fcount;

printf("%d\n",ans);    

return 0;}

洛谷 均分紙牌 NOIP2002提高組複賽

題目描述description 有 n 堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為 n 的倍數。可以在任一堆上取若於張紙牌,然後移動。移牌規則為 在編號為 1 堆上取的紙牌,只能移到編號為 2 的堆上 在編號為 n 的堆上取的紙牌,只能移到編號為 n 1 的堆上 其他堆上取的紙牌...

NOIP2002 提高組之一 均分紙牌

有 n 堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為 n 的倍數。可以在任一堆上取若於張紙牌,然後移動。移牌規則為 在編號為 1 堆上取的紙牌,只能移到編號為 2 的堆上 在編號為 n 的堆上取的紙牌,只能移到編號為 n 1 的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。...

Noip 2002 普及組 複賽試題

the first 級數求和 p1035 級數求和 解題報告 double運算即可,注意細節.include using namespace std intmain cout return0 級數求和 the second 選數 p1036 選數 解題報告 將給出的資料做公升序全排列 回溯 將得出的...