20160930的考试,noip模拟】SPFA,LIS,状压dp

来源:互联网 发布:linux tar压缩文件 编辑:程序博客网 时间:2024/06/11 19:03

#在全场ak的情况下80是怎样的体验#

钦定noip退役了QAQ

好嘛……其实是这样的……想着反正考三个小时不急不急,于是看着t3是状压就手敲dfs玩……敲完发现只剩两个小时了GG


啊……T1反正是个SPFA,然而没睡醒于是距离公式推错了……y=floor((19/20)*x),要使y成立的最小x=ceil(y*(20/19))……GG,自信了啊QAQ…………0’

T2……大意是给出一个1..n的排列,给每个逆序对连上无向边,求最大独立集…………yy一会儿之后发现就是求LIS(画一画搞一搞思考思考就好了)……关于为什么挂了……我……最后五分钟敲T2,忽然忘记了LIS怎么写……竟然手贱扔了个set上去……果断被卡掉了20’……我一定是脑残了23333

T3……一看数据范围就是个状压dp……然后…………我……手贱写dfs玩…………最后以赶稿的手速敲了dp……果然写错了……GG……爆零滚粗


代码……贴上吧

T1:

#include<bits/stdc++.h>#define MAXN 60#define MXX 150#define INF 0x3f3f3f3fusing namespace std;int n;struct t1{int to,nxt;}edge[MAXN*MAXN];int cnt_edge=0;int fst[MAXN];void addedge(int x,int y){edge[++cnt_edge].to=y;edge[cnt_edge].nxt=fst[x];fst[x]=cnt_edge;}int in_que[MAXN];int que[MXX],head,tail;int dis[MAXN];void SPFA(int v,int now){memset(dis,INF,sizeof dis);memset(in_que,0,sizeof in_que);head=tail=0;que[tail++]=now;dis[now]=v;while(head^tail){now=que[head++];if(head==MXX)head=0;for(int tmp=fst[now];tmp;tmp=edge[tmp].nxt){int aim=edge[tmp].to;if(now>=32){if(dis[aim]>dis[now]+1){dis[aim]=dis[now]+1;if(!in_que[aim]){que[tail++]=aim;if(tail==MXX)tail=0;}}}else{int kk=ceil(1.0*dis[now]/19);int tt=kk+dis[now];if(dis[aim]>tt){dis[aim]=tt;if(!in_que[aim]){que[tail++]=aim;if(tail==MXX)tail=0;}}}}}}char read_s1[10],read_s2[10];int read_x;int main(){freopen("toll.in","r",stdin);freopen("toll.out","w",stdout);int kase=0;if(!(~scanf("%d",&n)))return 0;while(~n){memset(edge,0,sizeof edge);memset(fst,0,sizeof fst);cnt_edge=0;++kase;for(int i=1;i<=n;++i){scanf("%s%s",read_s1,read_s2);addedge(read_s1[0]-'A',read_s2[0]-'A');addedge(read_s2[0]-'A',read_s1[0]-'A');}scanf("%d%s%s",&read_x,read_s1,read_s2);SPFA(read_x,read_s2[0]-'A');printf("Case %d: %d\n",kase,dis[read_s1[0]-'A']);if(!(~scanf("%d",&n)))return 0;}return 0;}

T2:

#include<bits/stdc++.h>#define MAXN 100005using namespace std;int n;int a[MAXN];int rec[MAXN];int ans=0;int main(){freopen("sort.in","r",stdin);freopen("sort.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",a+i);for(int i=1;i<=n;++i){if(a[i]>rec[ans])rec[++ans]=a[i];else rec[lower_bound(rec+1,rec+ans+1,a[i])-rec]=a[i];}printf("%d",ans);return 0;}

T3:

#include<bits/stdc++.h>#define MAXN 14using namespace std;int n;int ans=0;struct t1{int gl,rl,gk,rk,wk;}rec[MAXN];int rest_max=0;int rrr,ggg,www;int max_red;void read(){scanf("%d",&n);for(int i=0;i<n;++i)scanf("%d",&rec[i].rl);for(int i=0;i<n;++i)scanf("%d",&rec[i].gl);for(int i=0;i<n;++i)scanf("%d",&rec[i].rk),max_red+=rec[i].rk;for(int i=0;i<n;++i)scanf("%d",&rec[i].gk);for(int i=0;i<n;++i)scanf("%d",&rec[i].wk);scanf("%d%d%d",&rrr,&ggg,&www),max_red+=rrr;ans=rrr+ggg+www;}int f[1<<MAXN][150];int reach[1<<MAXN][150];int s[1<<MAXN];int main(){freopen("room.in","r",stdin);//freopen("room.out","w",stdout);read();for(int i=0;i<(1<<n);++i){s[i]=ans;for(int j=0;j<n;++j)if((1<<j)&i)s[i]+=rec[j].rk+rec[j].gk+rec[j].wk-rec[j].rl-rec[j].gl;}f[0][rrr]=www;reach[0][rrr]=1;for(int i=0;i<(1<<n);++i){for(int j=0;j<=max_red;++j){if(!reach[i][j])continue;ans=max(ans,s[i]);int nr=j,ng=s[i]-f[i][j]-j,nw=f[i][j];for(int k=0;k<n;++k){if(!(i&(1<<k))){int ss=i^(1<<k);int r_=nr,g_=ng,w_=nw;if(r_>=rec[k].rl)r_-=rec[k].rl;else{if(r_+w_<rec[k].rl)continue;else{r_=0;w_-=rec[k].rl-r_;}}if(g_>=rec[k].gl)g_-=rec[k].gl;else{if(g_+w_<rec[k].gl)continue;else{g_=0;w_-=rec[k].gl-g_;}}r_+=rec[k].rk, g_+=rec[k].gk, w_+=rec[k].wk;reach[ss][r_]=1;f[ss][r_]=w_;}}}}//for(int i=0;i<(1<<n);++i)printf("%d\n",s[i]);printf("%d",ans);return 0;}



0 0
原创粉丝点击