今天做了一下zoj的月赛。再次被虐。。只做出几道题目。
麻将虽然在天津遇到过,但这次还是被虐,等考试复习完了,得好好反思了。
差分约束,这道题目是一道差分约束的题目,其实很典型,一开始没有想清楚,当做上下界的网络流做了两个小时。。。大把大把的时间。
约束条件 :f[i] 表示前i块石头的能量总和。
f[R]-f[L-1]>=A
f[R]-f[L-1]<=B
f[i]-f[i-1]<=10000
f[i]-f[i-1]>=-10000
用SPFA跑一遍 dis[i]-dis[i-1]就是我们要的答案:
简单水题
注意点是对子不能重复。
状态压缩DP,一开始M的大小没看清楚数组只开到1<<10的大小,后来改成1<<22之后就A掉了,中途不断改代码,改的稀烂。。。
代码(写的很挫,写代码的时候改动很多)
C
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<vector> using namespace std; #define MAXN 1100 #define INF 10000000 struct node { int to; int dis; }; bool in[MAXN]; int s[MAXN]; int cnt[MAXN]; vector<node> g[MAXN]; int n,m,dis[MAXN]; bool spfa(int s) { queue<int> q; for(int i=0;i<=n;i++) { cnt[i]=0; dis[i]=INF; in[i]=false; } dis[s]=0; in[s]=true; q.push(s); cnt[s]++; while(!q.empty()) { int tag=q.front(); in[tag]=false; q.pop(); for(int i=0;i<g[tag].size();i++) { int j=g[tag][i].to; if(dis[tag]+g[tag][i].dis<dis[j]) { dis[j]=dis[tag]+g[tag][i].dis; if(!in[j]) { q.push(j); in[j]=true; cnt[j]++; if(cnt[j]>=n+1) return false; } } } } return true; } void solve() { int L,R,A,B; node tmp; for(int i=0;i<=n;i++) g[i].clear(); for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&L,&R,&A,&B); tmp.to=R; tmp.dis=B; g[L-1].push_back(tmp); tmp.to=L-1; tmp.dis=-A; g[R].push_back(tmp); } for(int i=1;i<=n;i++) { tmp.to=i-1; tmp.dis=10000; g[i].push_back(tmp); tmp.to=i; tmp.dis=10000; g[i-1].push_back(tmp); } if(spfa(0)) { for(int i=1;i<=n;i++) { if(i!=1) printf(" %d",dis[i]-(dis[i-1])); else printf("%d",dis[i]-(dis[i-1])); } printf("\n"); } else printf("The spacecraft is broken!\n"); } int main() { while(~scanf("%d%d",&n,&m)) solve(); return 0; }
F
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<iterator> using namespace std; #define INF 0x3f3f3f3f int mj[20]; char str[100]; bool cmp(int a,int b) { return a<b; } bool SevenPairs() { for(int i=0;i<7;i++) { if(mj[i*2]!=mj[i*2+1]) return false; if(i!=0 ) if(mj[i*2]==mj[i*2-1]) return false; } return true; } bool ThirteenOrphans() { vector<int> ve; ve.assign(mj,mj+14); vector<int>::iterator it = unique(ve.begin(),ve.end()); ve.erase(it, ve.end()); if(ve.size()==14) return false; for(int i=0;i<3;i++) { if(ve[i*2+1]-ve[i*2]!=8 && ve[i*2]==i*10+1) return false; } if(ve[6]!=31) return false; for(int i=7;i<13;i++) { if(ve[i]!=ve[i-1]+1) return false; } return true; } void solve() { for(int i=0;i<14;i++) { mj[i]=str[i*2]-'0'; switch(str[i*2+1]) { case 's': mj[i]+=10;break; case 'm': mj[i]+=20;break; case 'z': mj[i]+=30;break; } } sort(mj,mj+14,cmp); if(SevenPairs()) { printf("Seven Pairs\n"); return; } if(ThirteenOrphans()) { printf("Thirteen Orphans\n"); return; } printf("Neither!\n"); } int main() { while(~scanf("%s",&str)) solve(); return 0; }
J
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> using namespace std; #define INF 0x3fffff int dp[1<<22]; int state[1<<22],top; char tmp[200],str[200]; int n,m; void solve() { char s; scanf("%s",tmp); scanf("%d",&m); for(int i=1;i<=m;i++) str[i]='.'; for(int i=1;i<=strlen(tmp);i++) str[i+m]=tmp[i-1]; for(int i=strlen(tmp)+m+1;i<=strlen(tmp)+m+m;i++) str[i]='.'; top=0; for(int i=1;i<=strlen(tmp)+m;i++) { int ss=0; for(int j=0;j<m;j++) { if(str[i+j]=='*') ss|=(1<<j); } state[top++]=ss; } for(int i=strlen(tmp)+m+m;i>m;i--) { int ss=0; for(int j=0;j<m;j++) { if(str[i-j]=='*') ss|=(1<<j); } state[top++]=ss; } for(int s=0;s<(1<<m);s++) dp[s]=INF; dp[0]=0; for(int s=0;s<(1<<m);s++) { if(dp[s]==INF) continue; for(int k=0;k<top;k++) dp[s|state[k]]=min(dp[s]+1,dp[s|state[k]]); } if(dp[(1<<m)-1]==INF) printf("-1\n"); else printf("%d\n",dp[(1<<m)-1]); } int main() { while(~scanf("%d",&n)) solve(); return 0; }