這次整體題目個人認為不是非常難,但是想取得高分並不容易。
接下來是我的個人分析(包含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 個火柴的高度。每列火柴中相鄰兩根火柴...