日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 车站分级问题_【NOIP2013 普及组】车站分级

發布時間:2024/4/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 车站分级问题_【NOIP2013 普及组】车站分级 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【NOIP2013 普及組】車站分級

一、題目

【NOIP2013 普及組】車站分級

時間限制:?1 Sec??內存限制:?128 MB

提交:?3??解決:?0

[提交][狀態][討論版]

題目描述

一條單向的鐵路線上,依次有編號為 1, 2, …, n 的 n 個火車站。每個火車站都有一個級別,最低為 1 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站 x,則始發站、終點站之間所有級別大于等于火車站 x 的都必須停靠。(注意:起始站和終點站自然也算作事先已知需要停靠的站點)

例如,下表是 5 趟車次的運行情況。其中,前 4 趟車次均滿足要求,而第 5 趟車次由于停靠了 3 號火車站(2 級)卻未停靠途經的 6 號火車站(亦為 2 級)而不滿足要求。

現有 m 趟車次的運行情況(全部滿足要求),試推算這 n 個火車站至少分為幾個不同的級別。

輸入

輸入文件為 level.in。

第一行包含 2 個正整數 n, m,用一個空格隔開。

第 i + 1 行(1 ≤ i ≤ m)中,首先是一個正整數 si(2 ≤ si ≤ n),表示第 i 趟車次有 si 個停靠站;接下來有 si個正整數,表示所有停靠站的編號,從小到大排列。每兩個數之間用一個空格隔開。輸入保證所有的車次都滿足要求。

輸出

輸出文件為 level.out。

輸出只有一行,包含一個正整數,即 n 個火車站最少劃分的級別數。

樣例輸入

輸入樣例#1:

9 2

4 1 3 5 6

3 3 5 6

輸入樣例#2:

9 3

4 1 3 5 6

3 3 5 6

3 1 5 9

樣例輸出

輸出樣例#1:

2

輸出樣例#2:

3

提示

對于 20%的數據,1 ≤ n, m

≤ 10;

對于 50%的數據,1 ≤ n, m

≤ 100;

對于 100%的數據,1 ≤ n, m

≤ 1000。

二、分析及代碼

首先考慮50%的數據,我們知道對于每一列車,它經過的站點中停了的站點的等級肯定比沒停的站點高。因此對于每一輛車,我們可以把它經過的每一個沒停的站點向每一個停了的站點建一條邊。然后我們會得到一張圖,在這張圖上找最長的一條路段即可。

然后考慮正解,顯然對于點考慮是無法再優化了,因此我們考慮車。我們定義一輛車的等級就是它經過站點的最小等級。我們考慮如何判定兩輛車的等級大小。

對于兩輛車,它們如果沒有交點,那么它們的等級沒有關系。

兩輛車相交區間(都有停的區間)中,如果一輛車停的車輛多,那么它的等級低。

于是我們就建立了兩輛車之間的大小關系,同樣的,應用拓撲排序就可以找到這個最大的等級。

最后,還有一點要注意,因為我們處理的是車,而最后要求的是點。如果對于一輛等級為1的車,它經過的站點中如果有一個站點一輛車都沒有停靠,那么最后的答案就要加1。

對于測試數據二:

9 3

4 1 3 5 6

3 3 5 6

3 1 5 9

比如第二輛車和第三輛車,都停了站5,但是第三輛車沒有停3,所以第三輛車優先級比第二輛車高。

比如第一輛車和第二輛車的確有共同停靠站,且第一輛車停的站的確比第二輛車多,但是并不能說明第一輛車的等級低于第二輛車,因為起始站不同。

增加一輛每個站都停的列車,來作為等級最低的列車。

因為經過前面我們可以求出所有列車的等級,但是里面等級最低的一輛車要是有一個站沒停,就存在著更低的一輛列車。這樣才是正確的把點的等級轉化為站的等級。

邏輯為:

在兩輛車的最大共同區域里面,(1)有共同的站,(2)但是如果一輛車經過的站多,那么等級低。

問題分解為:

1、找兩輛車的最大公共區域(好找,頭里面的較大值,尾巴上的較小值)

2、計算公共區域里面的停靠站數

3、車輛數多的等級低

代碼:

50分

1 /*

2 分析:3 低優先度節點指向高優先度節點4 */

5

6 #include

7 #include

8 #define Maxn 1005

9 using namespacestd;10 intn,m;11 //stopStation[i][j]表示第i輛車停靠的第j站, stopStation[i][0]表示第i輛車停靠的車站數

12 intstopStation[Maxn][Maxn];13 //adjacentMatrix[i][j]為true表示j車站的優先級比i車站高14 //停了的站的優先級比沒停的高

15 booladjacentMatrix[Maxn][Maxn];16 boolstation[Maxn];17 intinDegree[Maxn];18 //隊列里面儲存入度為0(也就是當前優先級最低)的節點的編號,

19 queueque;20 boolvis[Maxn];21

22 intpriority[Maxn];23 intmaxPriority;24

25 voidreadData(){26 cin>>n>>m;27 for(int i=1;i<=m;i++){28 cin>>stopStation[i][0];29 for(int j=1;j<=stopStation[i][0];j++){30 cin>>stopStation[i][j];31 }32 }33 }34

35 voidprintRead(){36 cout<

45 void initArr_station(inti){46 for(int j=1;j<=n;j++){47 station[j]=false;48 }49 for(int j=1;j<=stopStation[i][0];j++){50 int x=stopStation[i][j];51 station[x]=true;52 }53 }54

55 voidprintArr_station(){56 for(int j=1;j<=n;j++){57 cout<

62 voidinitArr_adjacentMatrix(){63 for(int i=1;i<=n;i++){64 for(int j=1;j<=n;j++){65 adjacentMatrix[Maxn][Maxn]=false;66 }67 }68 //起點站之前的站是沒有經過,但是優先級并不比那些停了的站低69 //所以我比較優先級只能從起點站開始70 //我也只能以終點站結束

71 for(int i=1;i<=m;i++){72 initArr_station(i);73 int endStation=stopStation[i][stopStation[i][0]];74 for(int j=stopStation[i][1];j<=endStation;j++){75 if(station[j]) continue;76 for(int k=stopStation[i][1];k<=endStation;k++){77 if(station[k]){78 adjacentMatrix[j][k]=true;79 }80 }81 }82 }83 }84

85 voidprintArr_adjacentMatrix(){86 for(int i=1;i<=n;i++){87 for(int j=1;j<=n;j++){88 cout<

94 voidinitArr_inDegree(){95 for(int i=1;i<=n;i++){96 inDegree[i]=0;97 }98 for(int i=1;i<=n;i++){99 for(int j=1;j<=n;j++){100 if(adjacentMatrix[i][j]){101 inDegree[j]++;102 }103 }104 }105 }106

107 voidprintArr_inDegree(){108 for(int i=1;i<=n;i++){109 cout<

114 voidinitArr_vis(){115 for(int i=1;i<=n;i++){116 vis[i]=false;117 }118 }119

120 voidprintArr_vis(){121 for(int i=1;i<=n;i++){122 cout<

127 voidinitArr_priority(){128 for(int i=1;i<=n;i++){129 priority[i]=0;130 }131 }132

133 voidprintArr_priority(){134 for(int i=1;i<=n;i++){135 cout<

140

141 voidinit(){142 readData();143 //printRead();144 //initArr_station(2);145 //printArr_station();

146 initArr_adjacentMatrix();147 //printArr_adjacentMatrix();

148 initArr_inDegree();149 //printArr_inDegree();

150 initArr_vis();151 initArr_priority();152 //printArr_priority();

153 }154

155 void removeConnection(inti1){156 for(int j=1;j<=n;j++){157 adjacentMatrix[i1][j]=false;158 }159 }160

161 voidtopologicalSorting(){162 for(int i=1;i<=n;i++){163 if(inDegree[i]==0&&!vis[i]){164 vis[i]=true;165 que.push(i);166 priority[i]=1;167 }168 }169 while(!que.empty()){170 int i1=que.front();171 que.pop();172 removeConnection(i1);173 initArr_inDegree();174 //printArr_inDegree();

175 for(int i=1;i<=n;i++){176 if(inDegree[i]==0&&!vis[i]){177 vis[i]=true;178 que.push(i);179 priority[i]=priority[i1]+1;180 }181 }182 }183 }184

185 voidfindHighestPriority(){186 maxPriority=0;187 for(int i=1;i<=n;i++){188 if(priority[i]>maxPriority){189 maxPriority=priority[i];190 }191 }192 }193

194 voidprintAns(){195 //printArr_priority();

196 findHighestPriority();197 cout<

200 intmain(){201 freopen("4in.txt","r",stdin);202 init();203 topologicalSorting();204 printAns();205 return 0;206 }207

208 /*

209 1、1,n不一定是起點和終點210 起點站之前的站是沒有經過,但是優先級并不比那些停了的站低211 所以我比較優先級只能從起點站開始212 2、起點終點不一定是從0開始213 */

80分,比較車的等級

1 #include

2 #include

3 using namespacestd;4 //記錄每輛車停的每個站 stopStation[i][0]表示第i輛車停靠的站

5 int stopStation[1005][1005];6 intn,m;7 bool adjacentMatrix[1005][1005];8 //每一輛車的入度

9 int inDegree[1005];10 bool vis[1005];11 //每一輛車的等級

12 int priority[1005];13 //最大的等級,因為是從1開始,所以這個值就是答案

14 intmaxPriority;15 //隊列里面儲存入度為0(也就是當前優先級最低)的節點的編號,16 //用來做拓撲排序的隊列

17 queueque;18

19 //讀取數據

20 voidreadData(){21 cin>>n>>m;22 for(int i=1;i<=m;i++){23 cin>>stopStation[i][0];24 for(int j=1;j<=stopStation[i][0];j++){25 cin>>stopStation[i][j];26 }27 }28 }29

30 //打印讀取的數據

31 voidprintRead(){32 cout<

41 //增加一輛每個站都停的0號列車

42 voidinitArr_stopStation(){43 stopStation[0][0]=n;44 for(int j=1;j<=stopStation[0][0];j++){45 stopStation[0][j]=j;46 }47 }48

49 //打印數據 stopStation

50 voidprintArr_stopStation(){51 cout<

60 //找兩輛車(第i輛和第j輛)的最大公共區域(好找,頭里面的較大值,尾巴上的較小值)

61 void commonPathArea(int i,int j,int &start,int &end){62 int startI=stopStation[i][1];63 int endI=stopStation[i][stopStation[i][0]];64 int startJ=stopStation[j][1];65 int endJ=stopStation[j][stopStation[j][0]];66 start=max(startI,startJ);67 end=min(endI,endJ);68 }69

70 //計算第i輛車公共區域[start、end]里面的停靠站數

71 int stopStationNum(int i,int start,intend){72 int num=0;73 for(int j=1;j<=stopStation[i][0];j++){74 if(stopStation[i][j]>end) break;75 if(stopStation[i][j]>=start&&stopStation[i][j]<=end) num++;76 }77 returnnum;78 }79

80 //比較i,j兩輛車的等級

81 int compareGrade(int i,intj){82 intstart,end;83 commonPathArea(i,j,start,end);84 int numI=stopStationNum(i,start,end);85 int numJ=stopStationNum(j,start,end);86 if(numI==numJ) return 0;87 else if(numI

88 else if(numI>numJ) return -1;89 }90

91 //初始化數據 adjacentMatrix

92 voidinitArr_adjacentMatrix(){93 for(int i=0;i<=m;i++){94 for(int j=0;j<=m;j++){95 adjacentMatrix[i][j]=false;96 }97 }98 }99

100 //創建圖

101 voidcreatGraph(){102 for(int i=0;i<=m-1;i++){103 for(int j=i+1;j<=m;j++){104 if(compareGrade(i,j)==1) adjacentMatrix[j][i]=true;105 else if(compareGrade(i,j)==-1) adjacentMatrix[i][j]=true;106 }107 }108 }109

110 //打印圖

111 voidprintGraph(){112 for(int i=0;i<=m;i++){113 for(int j=0;j<=m;j++){114 cout<

120 //初始化每輛車的入度

121 voidinitArr_inDegree(){122 for(int i=0;i<=m;i++)123 inDegree[i]=0;124 }125

126 //打印每輛車的入度

127 voidprintArr_inDegree(){128 for(int i=0;i<=m;i++)129 cout<

133 //得到每輛車的入度

134 voidgetInDegree(){135 for(int i=0;i<=m;i++){136 for(int j=0;j<=m;j++){137 if(adjacentMatrix[i][j]) inDegree[j]++;138 }139 }140 }141

142 //初始化數據vis

143 voidinitArr_vis(){144 for(int i=0;i<=m;i++)145 vis[i]=false;146 }147

148 //初始化數據 priority

149 voidinitArr_priority(){150 for(int i=0;i<=m;i++)151 priority[i]=0;152 }153

154 //打印數組 priority

155 voidprintArr_priority(){156 for(int i=0;i<=m;i++)157 cout<

161 //取消節點i到其它節點的連接

162 void removeConnection(inti){163 for(int j=0;j<=m;j++){164 if(adjacentMatrix[i][j]) inDegree[j]--;165 }166 }167

168 //拓撲排序

169 voidtopologicalSorting(){170 for(int i=0;i<=m;i++){171 if(inDegree[i]==0&&!vis[i]){172 vis[i]=true;173 que.push(i);174 priority[i]=1;175 }176 }177 //printArr_priority();

178 while(!que.empty()){179 int i1=que.front();180 que.pop();181 removeConnection(i1);182 for(int i=0;i<=m;i++){183 if(inDegree[i]==0&&!vis[i]){184 vis[i]=true;185 que.push(i);186 priority[i]=priority[i1]+1;187 }188 }189 }190 }191

192 //找到最高優先級

193 voidfindHighestPriority(){194 maxPriority=0;195 for(int i=0;i<=m;i++){196 if(priority[i]>maxPriority){197 maxPriority=priority[i];198 }199 }200 }201

202

203 //打印結果

204 voidprintAns(){205 //printArr_priority();

206 findHighestPriority();207 cout<

210 //初始化

211 voidinit(){212 //讀取數據

213 readData();214 //printRead();215 //初始化數據 stopStation()

216 initArr_stopStation();//增加一輛每個站都停的0號列車217 //printArr_stopStation();218 //initArr_adjacentMatrix();219 //創建圖

220 creatGraph();221 //printGraph();222 //initArr_inDegree();223 //得到每輛車的入度

224 getInDegree();225 //printArr_inDegree();226 //initArr_vis();227 //initArr_priority();

228

229 }230

231

232 intmain(){233 freopen("4in.txt","r",stdin);234 //初始化

235 init();236 //拓撲排序

237 topologicalSorting();238 //打印結果

239 printAns();240 return 0;241

242 }

90分 還是比較站的等級,輸入時優化

1 #include

2 #include

3 #include

4 #include

5 using namespacestd;6 const int N=1e3+5,INF=1e9+5;7 inline intread(){8 char c=getchar();int x=0,f=1;9 while(c'9'){if(c=='-')f=-1;c=getchar();}10 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}11 return x*f;12 }13 int n,m,s,g[N][N],vis[N],lst[N],ind[N],ans=0;14 int st[N],top=0,buf[N],top2=0;15 voidtoposort(){16 for(int i=1;i<=n;i++) if(ind[i]==0) st[++top]=i;17 while(top){18 ans++;//printf("hi %d %d\n",ans,del);

19 while(top){20 int u=st[top--]; //printf("u %d\n",u);

21 for(int v=1;v<=n;v++) if(g[u][v]){22 ind[v]--; //printf("v %d %d\n",v,ind[v]);

23 if(ind[v]==0) buf[++top2]=v;24 }25 }26 for(int i=1;i<=top2;i++) st[i]=buf[i];27 top=top2;28 top2=0;29 }30 }31

32 //這是在讀數據的時候就完成了各種初始化,減少了循環次數,所以可以多得分

33 intmain(){34 freopen("4in.txt","r",stdin);35 n=read();m=read();36 for(int i=1;i<=m;i++){37 s=read();38 memset(vis,0,sizeof(vis));39 for(int j=1;j<=s;j++) lst[j]=read(),vis[lst[j]]=1;40 for(int j=lst[1];j<=lst[s];j++) if(!vis[j])41 for(int k=1;k<=s;k++) if(!g[lst[k]][j]) g[lst[k]][j]=1,ind[j]++;42 }43 toposort();44 printf("%d",ans);45 }

總結

以上是生活随笔為你收集整理的java 车站分级问题_【NOIP2013 普及组】车站分级的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人草| 在线视频 中文字幕 | 亚洲一区二区三区不卡视频 | 色女仆影院 | 国产一区二区三区免费视频 | 成年人网站免费 | 亚洲在线a | 中文字幕91 | 波多野吉衣视频在线观看 | 热久久精品 | 精品国产乱码久久久久夜深人妻 | 97久久超碰| 白丝动漫美女 | 一级bbbbbbbbb毛片 | 亚洲精品乱码久久久久久按摩观 | 精品黑人一区二区三区在线观看 | 毛片麻豆| 亚洲精品视频中文字幕 | 午夜极品视频 | 调教撅屁股啪调教打臀缝av | 中文字幕久久熟女蜜桃 | 欧美视频免费看 | 天堂网www.| 中文字幕免费在线观看视频 | 无码人妻精品一区二区中文 | 欧美日韩精品在线 | 97在线免费观看视频 | 亚洲69 | 国产高清无密码一区二区三区 | 欧美第九页 | 激情欧美一区二区三区精品 | 日韩少妇内射免费播放18禁裸乳 | 久久免费视频一区二区 | 国产精品玖玖玖 | 看免费黄色大片 | 国产成人av一区二区 | 免费黄色网址在线 | 日韩第八页 | 最新黄网 | 草久免费视频 | 亚洲免费三级 | 性欧美成人播放77777 | 成人在线观看亚洲 | 99re这里只有精品在线 | 亚洲第一成年人网站 | 国久久| 亚洲免费成人 | 狠色综合| 黄色大毛片 | 18欧美性xxxx极品hd | 亚洲午夜在线观看 | 嫩草影院一区 | 国产精品无码久久久久高潮 | 超碰97在线看 | 超碰在线超碰 | 日本50路肥熟bbw | 国产又大又粗又硬 | 波多野吉衣久久 | 26uuu欧美日本| 欧美黑人精品一区二区不卡 | 国产精品99re | 奇米四色7777 | 熊出没之冬日乐翻天免费高清观看 | 一区二区三区韩国 | 免费观看黄一级视频 | 日韩亚洲欧美在线观看 | 在线看网站 | 欧美精品在欧美一区二区少妇 | www.男人天堂 | 亚洲欧美激情一区二区三区 | 成人视屏在线观看 | 善良的公与媳hd中文字 | 久久精品一区 | 欧美专区在线视频 | 草草视频在线播放 | 99免费在线观看视频 | 正在播放欧美 | 国产精品无码一区二区三区 | 理论片一区| 在线观看日本一区 | 日韩电影在线观看一区二区 | 欧美日韩高清一区二区 | 欧美aaaaaaaaa | 成人看片网站 | 黄色一极视频 | 日韩一区二区三区网站 | 日韩美一区二区 | 黄色成人小视频 | 天堂资源在线观看 | 波多野结衣激情视频 | 久久六六| 欧美图片第一页 | 日韩精品综合 | 欧美成人性生活 | 黑人番号| 在线观看视频国产 | 国产经典一区二区三区 | 亚洲自拍偷拍区 | 嫩草影院污 |