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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

9.8 模拟试题

發布時間:2024/1/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 9.8 模拟试题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

XXY ?NOIP 模擬賽?2

題目

?

過路費

?

?

走樓梯升級版

蜂巢

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

stair

beehive

英文題目與子目錄名

?

fee

?

?

?

?

?

?

?

?

?

?

單個測試點時間限制

?

1秒

?

?

1

1

?

?

?

?

?

?

?

內存限制

?

128M

?

?

128M

128M

?

?

?

?

?

?

測試點數目

?

10

?

10

10

?

?

?

?

?

?

每個測試點分值

?

10

?

10

10

?

?

?

?

?

比較方式

?

全文比較(過濾行末空格及文末回車)

?

?

?

?

?

?

?

題目類型

?

傳統

?

?

傳統

傳統

?

?

?

?

?

?

?

?

?

?

?

過路費

Description

這是xxy的地盤,你在任何一條道路行走都需要交過路費。

這里有n個城市和m條雙向道路,每條道路連接兩個城市。你從某個城市出發到達某個城市。xxy已經在每一條雙向道路上設置一個過路費L?可能有多條道路連接相同的兩個城市,但是不存在一條道路連接一個城市和這個城市本身。

xxy竟然在每個城市上面也設置了一個過路費C。從一個城市到另外一個城市的費用,是經過的所有道路的過路費之和,加上經過的所有的城市(包括起點和終點)的過路費的最大值。 Xxy希望你寫一個程序,接受k個問題,每次計算從st的最小花費。如果st不連通,輸出-1

Input

第一行包含3個整數nmk

接下來n行,每行一個整數表示ci

接下來m行,每行3個整數abL,表示連接ab的雙向道路的過路費為L

接下來k行,每行2個整數st

Output

對于每個詢問,輸出一行表示答案

Example

Input

5 7 2

2

5

3

3

4

1 2 3

1 3 2

2 5 3

5 3 1

5 4 1

2 4 3

3 4 4

1 4

2 3

Output

8

9

對于30%的數據 n<=20,m<=50,k<=30

對于50%的數據 n<=110,m<=1000,k<=100

對于100%的數據 N<=250,m<=10000,k,c,L<=10000

?改編自:

?P2966 [USACO09DEC]牛收費路徑Cow Toll Paths

?

佛洛依德、、、

將點權進行排序,然后跑Floyd,我們在依次跑Floyd的時候保證k=n是的k的點權最大,也就是說這里我們在更新i到j這條路徑的時候依次是使的中間節點的點權最大,這樣保證中間節點的點權最大的話,我們就不用費力的去找他一條路徑上的最大點權了。

?

#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #define N 300 #define maxn 9999999 using namespace std; int n,m,x,y,z,k,dy[N],dis[N][N],f[N][N]; struct A {int id,c; }a[N]; int read() {int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f; } int cmp(A a,A b) {return a.c<b.c; } int main() {freopen("fee.in","r",stdin);freopen("fee.out","w",stdout);n=read(),m=read(),k=read();for(int i=1;i<=n;i++) a[i].c=read(),a[i].id=i;sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++) dy[a[i].id]=i;for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)f[i][j]=dis[i][j]=maxn;for(int i=1;i<=n;i++) f[i][i]=0;for(int i=1;i<=m;i++){x=read(),y=read(),z=read();x=dy[x],y=dy[y];f[x][y]=min(f[x][y],z);f[y][x]=f[x][y];}for(int v=1;v<=n;v++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){f[i][j]=min(f[i][j],f[i][v]+f[v][j]);dis[i][j]=min(dis[i][j],f[i][j]+max(max(a[i].c,a[v].c),a[j].c)); } for(int i=1;i<=k;i++){x=read(),y=read();x=dy[x],y=dy[y];if(f[x][y]>=maxn) printf("-1\n");else printf("%d\n",dis[x][y]);}return 0; } ac代碼

?

走樓梯升級版

Description

在你成功地解決了上一道走樓梯后,xxy?不禁有些氣惱,于是她又在樓梯上跳來跳去,想要你求出她跳的方案數。..?

xxy 站在一個?tot?階樓梯下面,他每次可以往上跳1—n步,往下跳1——m步(由于地心引力跳得比較遠),而且在往下跳的時候只能踩在往上跳時踩過的格子。?

現在 xxy?在樓梯上亂跳,想問她跳到樓梯頂上最后又跳回樓梯下面的方案數 mod 233333333。

注意:xxy?只能一直向上跳,跳到樓梯最上面,然后再往下跳,跳回樓梯最底下。

Inpu?

一行3個整數 totnm

Output?

方案數?% 233333333?

Example

Input

2

5 2 4

5 2 3

Output

52

42

Hint

10%的數據,1<=tot,n<=5,m=1

另外10%的數據,1<=tot,n,m<=5

另外20%的數據,1<=tot<=10000,1<=n,m<=5

另外20%的數據,1<=tot<=10000,1<=n,m<=10

另外20%的數據,1<=tot<=400000,1<=n,m<=5

對于100%的數據,1<=tot<=400000,1<=n,m<=10

?

?跟走樓梯的思路一樣。

走一遍樓梯,上去以后再下來可以看為從一層到最上面一層走兩遍。

我們單純的來看走一遍樓梯的情況,我們上去可以走1~n步,下來的時候可以選擇走1~m步。

那么我們上去的時候的狀態轉移方程是不是可以看為f[i]=f[i-1]+f[i-2]+fi-3]+……+f[i-n],下來的時候就可以看做fi]=f[i-1]+f[i-2]+fi-3]+……+f[i-m].

這個是只考慮走一遍的情況。我們現在的走樓梯是要上去以后再下來。

我們現在考慮爬上去以后再下來,那么我們就可以推出狀態轉移方程dp[i]=dp[i-1]*f[1]+dp[i-2]*f[2]+dp[i-3]*f[3]+……+dp[i-m]*f[m].

這個時候有人一定要問了,dp是什么??f[]又是什么??

dp是我們爬到當前階層時的方案數。我們先只考慮第二遍往下跳的時候,我們的方案數,上面我們說過了,這個時候的方案數是fi]=f[i-1]+f[i-2]+fi-3]+……+f[i-m]。由于我們每次下樓的時候必須走上樓時走過的樓梯,也就是說我們要在跳下來的臺階數要被跳上過一次,例如我們現在要向下跳j步,這個時候我們跳上去的方案數就變成了f[j]=f[j-1]+f[j-2]+……+f[j-n],這就相當于我們要跳j層臺階,一共可以走1~n步,有幾種方案數。

我們在利用乘法原理+加法原理,就好了。

(加法原理,我們當前點可以有好幾種走法,首先它可以從i-1跳到i,可以從i-2跳到i,也可以從i-3跳到i、、、、、這幾種走法的和為總方案數。對于每一種走法,我們又要分兩步,在進行乘法原理。

? ?乘法原理,我們要跳到當前點分兩步,一步向上跳,另一步是向下跳,這兩步的方案數的乘積就是總共的方案數。)

#include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 410000 #define mod 233333333 using namespace std; long long t,tot,n,m,dp[N],f[N]; long long read() {long long x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f; } int main() {freopen("stair.in","r",stdin);freopen("stair.out","w",stdout);t=read();while(t--){memset(f,0,sizeof(f));memset(dp,0,sizeof(dp));tot=read(),n=read(),m=read();f[0]=1;for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)if(i-j>=0) f[i]+=f[i-j];else break;dp[0]=1;for(int i=1;i<=tot;i++)for(int j=1;j<=m;j++)if(i-j>=0) dp[i]=(dp[i]+dp[i-j]*f[j])%mod;else break;printf("%I64d\n",dp[tot]);}return 0; } AC代碼

?

蜂巢

Description

求上圖兩點間的最短距離

Input

輸入包含多組測試數據

每組數據包含一行,每行包含兩個整數a,b

Output

對于每組測試數據,輸出一行,

每行三個整數 a,b,dis,表示a與b之間的最短距離為dis

Example

Input

2 35

26 14

3 7

Output

3

3

2

Hint

對于10%的數據,1<=a,b<=10,數據組數<=10

對于30%的數據,1<=a,b<=100,數據組數<=1000

對于50%的數據,1<=a,b<=1000,數據組數<=160000

對于70%的數據,1<=a,b<=10000,數據組數<=500000

對于100%的數據,1<=a,b<=100000,數據組數<=500000

?

棄療

http://www.cnblogs.com/TheRoadToTheGold/p/7404189.html

#include<cmath> #include<cstdio> #include<algorithm> using namespace std; int dx[6]={0,-1,-1,0,1,1}; int dy[6]={-1,-1,0,1,1,0}; int s[6]={2,1,2,2,2,2}; int x[10001],y[10001]; int main() {y[2]=-1;x[3]=-1; y[3]=-1;x[4]=-1;y[5]=1;x[6]=1; y[6]=1;int nowd=0,nows=1,nowx=1,nowy=1;for(int now=7;now<=10000;now++){if(nows>s[nowd]) nows=1,nowd++;if(nowd>=6) {nowd=0;for(int i=0;i<6;i++) s[i]++;}nowx+=dx[nowd];nowy+=dy[nowd];x[now]=nowx;y[now]=nowy;nows++;}int a,b,aa,bb;while(scanf("%d%d",&aa,&bb)!=EOF){a=aa; b=bb;if(!a) return 0;if(x[a]>x[b]) swap(a,b);if(x[a]!=x[b] && y[a]<y[b]) printf("The distance between cells %d and %d is %d.\n",aa,bb,max(x[b]-x[a],y[b]-y[a]));else printf("The distance between cells %d and %d is %d.\n",aa,bb,abs(y[a]-y[b])+x[b]-x[a]);} } 粘個大佬的代碼

?

轉載于:https://www.cnblogs.com/z360/p/7496500.html

總結

以上是生活随笔為你收集整理的9.8 模拟试题的全部內容,希望文章能夠幫你解決所遇到的問題。

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