NOIP模拟赛16
NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2
期望得分:100+100+ =200+
实际得分:100+40+70=210
T1天天寄快递
直接模拟,代码丢了。。。。。。
T2天天和不可描述
splay可A
正解dfs+list
#include<iostream> #include<list> #include<cstdio> using namespace std; list<char>s; char c; void getstr(bool rev,list<char>&tmp) { tmp.clear(); while(true) { c=cin.get(); if(c==')') break; else if(c=='(') { list<char>tmp2; getstr(!rev,tmp2); if(rev) s.splice(tmp.begin(),tmp2); else s.splice(tmp.end(),tmp2); } else if(rev) tmp.push_front(c); else tmp.push_back(c); } } int main() { while(1) { c=cin.get(); if(c==EOF) break; else if(c=='(') { list<char>tmp; getstr(true,tmp); s.splice(s.end(),tmp); } else s.push_back(c); } for(list<char>::iterator iter=s.begin();iter!=s.end();iter++) cout<<*iter; return 0; }
T3 罪犯分组
状压DP
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; bool map[20][20]; int f[1<<16|1]; int main() { int n,m,k,u,v; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) scanf("%d%d",&u,&v),u--,v--,map[u][v]=map[v][u]=true; memset(f,63,sizeof(f)); int S=1<<n; f[0]=0; int sum; for(int i=1;i<S;i++) { sum=0; for(int j=0;j<n;j++) for(int k=j+1;k<n;k++) if((1<<k)&i && (1<<j)&i && map[j][k]) sum++; if(sum<=k) f[i]=1; for(int j=i;j;j=(j-1)&i) f[i]=min(f[i],f[j]+f[j^i]); } printf("%d",f[S-1]); }