BZOJ3139/BZOJ1306 HNOI2013比赛/CQOI2009循环赛(搜索)
生活随笔
收集整理的這篇文章主要介紹了
BZOJ3139/BZOJ1306 HNOI2013比赛/CQOI2009循环赛(搜索)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
搜索好難啊。
1.對于每個分數(shù)集合記憶化。
2.某人得分超過總分,剪枝。
3.某人之后全贏也無法達到總分,剪枝。
4.每有一場比賽分出勝負總分會多三分,而平局則會多兩分。某人的分出勝負場次或平局場次超過該限制,剪枝。
面向代碼編程直到除了變量名幾乎都一模一樣還是T。最后發(fā)現(xiàn)記憶化判斷某個狀態(tài)是否已經搜過的時候,寫成f.find(x)==f.end()而不是!f[x]會快幾倍。果然一直都沒有學會map。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<map> using namespace std; int read() {int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f; } #define P 1000000007 #define N 11 #define ll long long int n,s,a[N],b[N],lim1,lim2; map<ll,ll> f; ll dfs(int k,int p) {if (k==n) return 1;if (a[k]>3*(n-p+1)) return 0;if (p>n){ll h=0;for (int i=k+1;i<=n;i++) b[i]=a[i];sort(b+k+1,b+n+1);for (int i=k+1;i<=n;i++) h=h*30+b[i];if (f.find(h)==f.end()) f[h]=dfs(k+1,k+2);return f[h];}else{ll sum=0;if (a[k]>=3&&lim1) {a[k]-=3;lim1--;sum+=dfs(k,p+1);lim1++;a[k]+=3;}if (a[k]>0&&a[p]>0&&lim2) {a[k]--,a[p]--;lim2--;sum+=dfs(k,p+1);lim2++;a[k]++,a[p]++;}if (a[p]>=3&&lim1) {a[p]-=3;lim1--;sum+=dfs(k,p+1);lim1++;a[p]+=3;}return sum;} } int main() { #ifndef ONLINE_JUDGEfreopen("bzoj3139.in","r",stdin);freopen("bzoj3139.out","w",stdout);const char LL[]="%I64d\n"; #elseconst char LL[]="%lld\n"; #endifn=read();for (int i=1;i<=n;i++) s+=a[i]=read();sort(a+1,a+n+1);reverse(a+1,a+n+1);lim1=s-(n-1)*n,lim2=(s-3*(s-(n-1)*n))>>1;cout<<dfs(1,2)%P;return 0; }?
轉載于:https://www.cnblogs.com/Gloid/p/9820692.html
總結
以上是生活随笔為你收集整理的BZOJ3139/BZOJ1306 HNOI2013比赛/CQOI2009循环赛(搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是Java Marker Inter
- 下一篇: nginx 目录讲解