noip2013題解 普及組

2021-06-19 08:13:42 字數 3115 閱讀 3097

這次整體題目個人認為不是非常難,但是想取得高分並不容易。

接下來是我的個人分析(包含ak**)

1.計數問題

首先,第一眼看到這個題目我就驚呆了。因為做過。看了看資料範圍,比較小,每個數字最多6位,1000000個,6000000次秒過是沒有太大的問題的。

只要將每乙個數字分離即可。

#include#includeusing namespace std;

const int max_p = 10;

int ans = 0;

int n,x;

void init()

void makenx(int t)

}void work()

void put()

int main()

2.表示式求值

看到題目,我又驚呆了。還是做過。

可以用棧,但是我平常不習慣,而且用得不熟,畢竟是考試,就怕溢位。

首先我們將問題分解,就是先把所有的乘法算出,再算加法。每次mod1k

考慮特殊情況

1.第乙個數字前沒有符號

2.加好後面的數字沒有符號

3.數字總長度不能開10w陣列

#include#include#includeusing namespace std;

const int max_n = 5000000;

const int inf = 10000;

char s[max_n];

int ans = 0;

int length;

void init()

void work()

tmp%=inf; //mod 1k

ctmp=tmp; //乘法第一項就是tmp

while (j='0'&&s[k]<='9')

tmp%=inf; //注意先餘 否則int_max*1k會大於int_max

ctmp = ctmp*tmp%inf;

j=k;

} ans = (ans+ctmp)%inf; //作為乙個加法的結束

i=j+1; }}

void put()

int main()

3.小朋友的數字

看到題目,依然驚呆,不過可惜沒ac,誒,高精度當時考慮了 當時覺得沒必要,但是。。不說了,全是淚。

首先由貪心思想做最大子矩陣。

不多說。

考慮一下 如果每個數都是10ww 那麼特徵值最大n^2*10ww = 10^21

加上分數大概在10^20左右

long long 和int64爆了。

所以要用兩個10億進製。見**

#include#includeusing namespace std;

const int max_n = 1000001;

const long long inf = 1000000000000;

int num[max_n];

long long speasnum[max_n][2]; //[2]表示兩位 每一位儲存後面12位數字

long long marknum[max_n][2];

long long sans[2];

long long mans[2];

long long ans[2];

int n;int p;

void init()

void finding_speasnum()

speasnum[i][0]=sans[0];

speasnum[i][1]=sans[1]; //將目前的最大欄位和放到特徵值中 }}

void finding_marknum()

if (marknum[i][1]>ans[1]||(marknum[i][1]==ans[1]&&marknum[i][0]>ans[0])) //更新ans

}}void work()

void put()

//這裡先取絕對值,安全一點,還好今年沒有-0的測試點

while(p>1)

putans+=ans[0];

putans%=p;

cout<

4.車站分級

首先由貪心思想。

找到兩個車站的值 如果a路線中包含b 且a不停 b停車 就用a更新b

但是有反例:

5 21 5

2 3輸出:2

答案:3

所以很快想到拓撲排序:

如果a路線中包含b 且a不停 b停車 就存在一條邊權為1的有向邊(a,b)

我們就用拓撲排序的思想解決問題。

但是很快發現m=1000 n=1000

構圖需要m*(n^2)的時間承受不了。

也就是說如果有一條線路中包含8個車站,那麼有3個車站停,5各車站不停

就產生3*5條邊

我們很快又想到並查集,但是解決不了,不過可以借鑑思想。

這5個車站都聯通另外乙個bt車站權值為0

而bt車站到另外3個要停的車站邊權為1

就完成構圖。

我的分析應該是產生2*n^2條邊。

就完全沒壓力了

這次最後一題也是這麼多年以來,少於100行的為數不多的幾次

第三題反而長一點。

#include#include#include#includeusing namespace std;

const int max_n = 2002;

int n,m;int p;

int s[max_n]; //how many stations in route i

int level[max_n]; //level

int infor[max_n][max_n]; //info about route i

vectord[max_n]; //don't stop here

vectorp[max_n]; //stop here

int adj[max_n][max_n];

int con[max_n];

void init()

else //掃瞄那些節點在d停車的節點中 那些在p不停的當中

} p++; //產生bt節點

for (j=0;j

NOIP2013普及組 車站分級

題目 洛谷p1983 vijos p1851 codevs3294。題目大意 有一些車停靠某些站。現在要給所有站分級,規定一輛車停靠的所有站的最小級數必須大於 起點 終點 所有不停靠的站的最大級數。問至少分成幾種不同的級數?解題思路 由於停靠的站級數大於不停靠的站,我們把每列車停靠的站向不停靠的連一...

NOIp2013普及組 車站分級

思路 對於每一趟車,將區間內所有經停的站和所有未經停的站連一條邊,表示前者優先順序一定高於後者,然後用kahn跑一遍拓撲排序即可。然而這樣會創造大量多餘的邊,會tle1個點。考慮一種優化 因為每趟車本身也有乙個優先順序,因此可以將這趟車也看作乙個點,每次先所有將經停的站連一條邊到這兩車上,表示這些站...

NOIp 2013 提高組 火柴排隊 題解

問題描述 涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自 排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 i 1n ai b i 2 其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴...