連接:http://codeforces.com/contest/1132html
題解:首先 "()" 這個的數量多少是沒有關係的,可是 "((" 和 "))" 的數量必須是相等的,再而後若是存在 ")(" 的話,"((" 和 "))" 的數目就必需要大於零。c++
AC代碼:優化
#include<bits/stdc++.h> using namespace std; int a,b,c,d; int main() { cin>>a>>b>>c>>d; if(a==d) { if(c>0 && a==0 && d==0) cout<<0<<endl; else cout<<1<<endl; } else cout<<0<<endl; }
題意:有 $n$ 塊巧克力,每一個價格爲 $a[i]$,你必須把它們都買完。如今你有 $m$ 張優惠券,一張優惠券能夠使你買任意 $q[i]$ 塊巧克力並讓你免去其中最便宜的那塊巧克力的錢,剩下的都要全款買下。你要給出用每張優惠券買完全部巧克力的最少花費。spa
題解:很顯然,若是一張優惠券只能買一塊巧克力是最好的,能免去最貴的那塊巧克力的錢;能買兩個的次之,能免去次貴的巧克力的錢;以此類推。code
AC代碼:htm
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=3e5+10; int n,m,a[maxn]; int main() { scanf("%d",&n); ll sum=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]), sum+=a[i]; sort(a+1,a+n+1,greater<int>{}); scanf("%d",&m); for(int i=1,q;i<=m;i++) { scanf("%d",&q); printf("%I64d\n",sum-a[q]); } }
網上看題解,竟然能夠搜過去?有點神仙啊……blog
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll w,a[10],ans; void dfs(int p,ll x) { if(p==9) { ans=max(ans,x); return; } ll v=min((w-x)/p,a[p]); for(int t=9;t>0;t--) dfs(p+1,x+max(0LL,(v--)*p)); } int main() { cin>>w; for(int i=1;i<=8;i++) cin>>a[i]; dfs(1,0); cout<<ans<<endl; }
題解:設 $f[l][r]$ 是消除 $[l,r]$ 區間所花的最少次數,對於每次更新:隊列
一、若是 $s[l]=s[r]$,$f[l][r]=min(f[l][r],f[l+1][r−1]+1)$;ci
二、若是 $s[l] \neq s[r]$,$f[l][r]=min(f[l][r],min(f[l+1][r],f[l][r−1])+1)$get
三、枚舉中間點 $k=l \sim r$,$f[l][r]=min(f[l][r],f[l][k]+f[k][r]−1)$,這樣的話 $k$ 這個點刪了兩次,因此要減一,由於 $l,k,r$ 可能被同時刪去,因此要這樣轉移。
AC代碼:
#include<bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; const int maxn=505; int n; char s[maxn]; int f[maxn][maxn]; int main() { cin>>n; scanf("%s",s+1); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) f[i][i]=1; for(int len=2;len<=n;len++) { for(int i=1,j=i+len-1;j<=n;i++,j++) { f[i][j]=INF; if(s[i]==s[j]) f[i][j]=min(f[i][j],f[i+1][j-1]+1); else f[i][j]=min(f[i][j],min(f[i+1][j],f[i][j-1])+1); for(int k=i;k<=j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k][j]-1); } } cout<<f[1][n]<<endl; }