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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ZOJ 3747 Attack on Titans

發布時間:2023/12/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZOJ 3747 Attack on Titans 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3747

題意:

現在有n個士兵進行排序,只有G、R、P三種士兵,要求至少有m個G士兵連續和至多k個R士兵連續,問可以有多少種排法。

?

思路:

由于題目中一個是至少,另一個是至多,所以先把至少改成至多:(至多有n個G士兵連續,k個R士兵連續)-(至多有m-1個士兵連續,k個士兵連續),這樣一來,剩下的情況當中G士兵的個數就是【m,n】,滿足至少有m個G士兵連續。

?

d【i】【j】表示當前第i個人是j號兵種時的方法數。(G:0 ; R:1 ; P:2)

由于當前方法數需要根據上一步推出來,那么上一步的方法數為sum=d【i-1】【0】+d【i-1】【1】+d【i-1】【2】。

①第i個人是P號兵種:

? ?這就很簡單了,因為P兵種沒有限制,所以直接d【i】【2】=sum。

②第i個人是G號兵種: ?(u表示至多有u個G士兵連續)

? ?1)、如果i<=u,那么此時不可能出現u個G連續的情況,直接d【i】【1】=sum。

? ?2)、如果i=u+1,那么此時就會有前i個都為G的情況,而且只有這么一種情況,所以d【i】【1】=sum-1。

? ?3)、如果i>u+1,此時i-u~i-1就會出現都為G的情況,那么此時第i-u-1位就可以為R士兵和P士兵,所以d【i】【1】=sum-d【i-u-1】【1】-d【i-u-1】【2】。

③第i個是R號兵種:

? ?同理分析即可。

1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 #include<set> 12 using namespace std; 13 typedef long long ll; 14 typedef pair<int,int> pll; 15 const int INF = 0x3f3f3f3f; 16 const int maxn = 1000000 + 5; 17 18 const int mod=1000000007; 19 20 int n,m,k; 21 ll d[maxn][4]; 22 23 ll compute(ll u, ll v) 24 { 25 d[0][0]=1; 26 d[0][1]=d[0][2]=0; 27 for(int i=1;i<=n;i++) 28 { 29 ll sum = (d[i-1][0]+d[i-1][1]+d[i-1][2])%mod; 30 31 //如果第i位是P 32 d[i][2]=sum; 33 34 //如果第i位是G 35 if(i<=u) 36 d[i][0]=sum; 37 else if(i==u+1) 38 d[i][0]=sum-1; 39 else 40 d[i][0]=sum-d[i-u-1][1]-d[i-u-1][2]; 41 42 //如果第i位是R 43 if(i<=v) 44 d[i][1]=sum; 45 else if(i==v+1) 46 d[i][1]=sum-1; 47 else d[i][1]=sum-d[i-v-1][0]-d[i-v-1][2]; 48 } 49 return (d[n][0]+d[n][1]+d[n][2])%mod; 50 } 51 52 int main() 53 { 54 //freopen("in.txt","r",stdin); 55 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 56 { 57 printf("%lld\n",((compute(n,k)-compute(m-1,k))%mod+mod)%mod); 58 } 59 return 0; 60 }

?

轉載于:https://www.cnblogs.com/zyb993963526/p/7203833.html

總結

以上是生活随笔為你收集整理的ZOJ 3747 Attack on Titans的全部內容,希望文章能夠幫你解決所遇到的問題。

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