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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【JLOI2013】地形生成

發(fā)布時(shí)間:2024/1/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JLOI2013】地形生成 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先考慮第一個(gè)問題(先假設(shè)沒有山高度相同)

我們把所有山按高度從大到小排序,設(shè)這個(gè)集合為S,設(shè)一個(gè)空集合為V,

我們把山按順序放入集合V。

考慮第i座山插進(jìn)去的時(shí)候能放的位置,因?yàn)楝F(xiàn)在前面有i - 1座山比它高,再加上本來(lái)的第i個(gè)位置,它一共有i個(gè)位置可以放。這個(gè)山的關(guān)鍵值如果為k,它只能在前min(k,i)個(gè)位置里挑。

所以第i個(gè)山的放的位置的組合為ci = min(k,i)種。ans = c1 * c2 …… * cn;

但是我們現(xiàn)在有山的高度相同,且關(guān)鍵值不同。兩座高度相同的山能放的最靠后的位置,一定是關(guān)鍵值大的那個(gè)越靠后。所以我們先按高度從大到小,然后高度相同的關(guān)鍵值從小到大排序出S集合。

設(shè)[x,y]這段區(qū)間的山高度相同。所以 ci = min(x,k) + i - x。因?yàn)橐蛔皆跐M足關(guān)鍵值的情況下,可以也放在高度相同的山前面。

所以最后 得出 ans1 = c1 * c2 …… * cn;

接下來(lái)為第二個(gè)問題:
我們每次都把高度相同的一起加入,
我們考慮把這個(gè)問題轉(zhuǎn)化成最經(jīng)典的球盒模型,大致能搞成這個(gè)樣子:
把n個(gè)沒有標(biāo)號(hào)的球放進(jìn)m個(gè)盒子里,允許有盒子為空,但是第i個(gè)球只能放到前pi個(gè)盒子里,我們把pi從小到大排序后,可以強(qiáng)行規(guī)定pi小的只能出現(xiàn)在pi大的球之前,這樣就變成了無(wú)標(biāo)號(hào)的了。

于是就有一個(gè)dp,設(shè)f[i][j]表示第i個(gè)球嚴(yán)格放在第j個(gè)盒子里的方案數(shù)

f[i][j]=∑k=1~j f[i-1][k]?
因?yàn)閒[i][j-1]=∑k=1~j-1 f[i-1][k]
所以f[i][j] = f[i - 1][j] + f[i][j - 1]?
我們?cè)儆脻L動(dòng)數(shù)組,得最終方程
f[i]=f[i]+f[i-1]
[x,y]這一段的方案數(shù)為c= f[1] + f[2] +……f[min(a[y].key,x) ]
最后再將每個(gè)c連乘就可以啦

*以上部分經(jīng)過他人借見,感謝!

#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; struct node{int h,key;}a[1005]; const int mod=2011; int n,f[1005]; bool cmp(const node &a,const node &b){return a.h>b.h||(a.h==b.h&&a.key<b.key);} void work1() {int i,j,k;sort(a+1,a+n+1,cmp);int num=0,ans1=1;for(i=1;i<=n;i++){if(a[i].h!=a[i-1].h)num=i;//num記錄相同高度的一段的開頭 ans1=(ans1*(min(a[i].key,num)+i-num))%mod;}printf("%d ",ans1); } void work2() {int i,j,k,pos,sum,ans2=1;for(i=1;i<=n;i=pos+1){memset(f,0,sizeof(f));f[1]=1;pos=i;while(pos<=n&&a[i].h==a[pos].h)pos++;pos--;//a[i].h~a[pos].h相同 for(j=i;j<=pos;j++)for(k=2;k<=min(a[j].key,i);k++)f[k]=(f[k-1]+f[k])%mod;sum=0;for(j=1;j<=min(a[pos].key,i);j++)sum=(sum+f[j])%mod;ans2=(ans2*sum)%mod; }printf("%d",ans2); } int main() {int i,j,k;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d%d",&a[i].h,&a[i].key);work1();work2();return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/dsb-y/p/11205867.html

總結(jié)

以上是生活随笔為你收集整理的【JLOI2013】地形生成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。