130825组队赛-Regionals 2012, North America - East Central NA
A.Babs' Box Boutique
一道简单的dfs搜索题,需要两两比较,然后搜到底,得到最大值就行了。比赛时队友写的,我只负责debug。。赛后自己写的。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i<b;++i)
#define N 1000000007
using namespace std;
inline void RD(int &ret)
{char c;do{c=getchar();}while(c<'0'||c>'9');ret=c-'0';while((c=getchar())>='0'&&c<='9'){ret=ret*10+(c-'0');}
}
inline void OT(int a)
{if(a>=10){OT(a/10);}putchar(a%10+'0');
}
struct xl
{int x,y,z;
} a[11];
int n,ans,v[11];
void dfs(int x,int y,int d)
{ans=max(d,ans);if(d==n){return ;}int i;for(i=0; i<n; ++i){if(v[i]==0){if(a[i].x>=x&&a[i].y>=y)//对应比较{v[i]=1;dfs(a[i].x,a[i].y,d+1);v[i]=0;}else if(a[i].x>=x&&a[i].z>=y){v[i]=1;dfs(a[i].x,a[i].z,d+1);v[i]=0;}else if(a[i].y>=x&&a[i].z>=y){v[i]=1;dfs(a[i].y,a[i].z,d+1);v[i]=0;}}}
}
int main()
{int i,t[4],cas=0;while(1){RD(n);if(n==0){break;}cas++;for(i=0; i<n; ++i){RD(t[0]);RD(t[1]);RD(t[2]);sort(t,t+3);//注意排序a[i].x=t[0];a[i].y=t[1];a[i].z=t[2];}ans=0;mem(v,0);dfs(0,0,0);printf("Case %d: ",cas);OT(ans);printf("\n");}return 0;
}
B.Flash Mob
简单的求中位数和曼哈顿距离,直接对xi和yi分别排序,然后取中位数,中位数与其他点求曼哈顿距离。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i<b;++i)
#define N 1000000007
using namespace std;
inline void RD(int &ret)
{char c;do{c=getchar();}while(c<'0'||c>'9');ret=c-'0';while((c=getchar())>='0'&&c<='9'){ret=ret*10+(c-'0');}
}
inline void OT(int a)
{if(a>=10){OT(a/10);}putchar(a%10+'0');
}
int x[1001],y[1001],n;
int f(int a,int b)
{int sum=0,i;FOR(1,n,i){sum+=abs(a-x[i]+b-y[i]);}return sum;
}
int main()
{int i,cas=0;while(1){RD(n);if(n==0){break;}cas++;for(i=1;i<=n;++i){scanf("%d%d",&x[i],&y[i]);}sort(x+1,x+n+1);sort(y+1,y+n+1);printf("Case %d: (%d,%d) %d\n",cas,x[(1+n)/2],y[(n+1)/2],f(x[(1+n)/2],y[(n+1)/2]));}return 0;
}
C.Hexagon Perplexagon
一道枚举题,可以dfs搜,也可以用next_permutation得到所有情况然后暴力查找符合条件的值,我用的是next_permutation,险过。。。需要用到二维数组标记。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i<b;++i)
#define N 1000000007
using namespace std;
inline void RD(int &ret)
{char c;do{c=getchar();}while(c<'0'||c>'9');ret=c-'0';while((c=getchar())>='0'&&c<='9'){ret=ret*10+(c-'0');}
}
inline void OT(int a)
{if(a>=10){OT(a/10);}putchar(a%10+'0');
}
int a[11][11],p[11][11],id[11],high[11],low[11];
int main()
{int t,i,j,tt,cas=0;bool f,g;RD(t);while(t--){cas++;for(i=0; i<7; ++i){id[i]=i;for(j=0; j<6; ++j){RD(a[i][j]);}for(j=0; j<6; ++j){p[i][a[i][j]]=j;//标记数组}}f=false;do{for(i=1; i<7; ++i){tt=p[id[0]][1]+i-1;if(tt>=6){tt-=6;}j=a[id[0]][tt];tt=p[id[i]][j]+1;if(tt>=6){tt-=6;}low[i]=a[id[i]][tt];tt=p[id[i]][j]-1;if(tt<0){tt+=6;}high[i]=a[id[i]][tt];}low[7]=low[1];g=true;for(i=1; i<7; ++i){if(high[i]!=low[i+1])//左右比较{g=false;break;}}if(g==true){f=true;break;}}while(next_permutation(id,id+7));printf("Case %d: ",cas);if(f==true){for(i=0; i<6; ++i){printf("%d ",id[i]);}printf("%d\n",id[6]);}else{printf("No solution\n");}}return 0;
}
D.I've Got Your Back(gammon)
一道映射题,表示不同的检索方式和不同的数代表不同的序列。。。直接暴力就行。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i<b;++i)
#define N 1000000007
using namespace std;
inline void RD(int &ret)
{char c;do{c=getchar();}while(c<'0'||c>'9');ret=c-'0';while((c=getchar())>='0'&&c<='9'){ret=ret*10+(c-'0');}
}
inline void OT(int a)
{if(a>=10){OT(a/10);}putchar(a%10+'0');
}
int a[6],an[6],num,f[6][16][16];
char c[2];
void init()
{int i,j,k;For(0,6,j){For(0,16,i){For(0,16,k){f[j][i][k]=0;}}}
}
int main()
{init();int i,j,k,l;FOR(1,15,i)//预处理{FOR(1,15,j){if(j==i){f[0][j][i]=1;}else{f[0][j][i]=0;}f[0][0][i]+=f[0][j][i];}}For(1,6,k){FOR(1,15,j){f[k][j][j]=1;f[k][0][j]+=1;for(i=j+1; i<=15; i++){for(l=k-1; l>=0; l--){f[k][j][i]+=f[l][0][i-j];}f[k][0][i]+=f[k][j][i];}}}int cas=0,num,sum,ans,tmp;while(scanf("%s",c)){cas++;if(c[0]=='m'){For(0,6,i){RD(a[i]);}num=15;ans=0;For(0,6,j){if(a[j]>0){for(i=4-j; i>=0; i--){for(k=num-a[j]+1; k<=num; k++){ans+=f[i][0][k];}}}num-=a[j];if(num==0){ans++;break;}}printf("Case %d: %d\n",cas,ans-1);}else if(c[0]=='u'){For(0,6,j){an[j]=0;}scanf("%d",&sum);sum++;num=15;ans=0;while(num>0){ans=0;for(j=0; j<6; j++){ans+=f[j][0][num];if(ans>=sum){break;}}if(ans==sum){an[j]=num;break;}ans-=f[j][0][num];sum-=ans;FOR(1,num,i){tmp=0;For(0,j,k){tmp+=f[k][0][num-i];}if(tmp>=sum){break;}else{sum-=tmp;}}num-=i;an[j]=i;}printf("Case %d: %d %d %d %d %d %d\n",cas,an[5],an[4],an[3],an[2],an[1],an[0]);}else{break;}}return 0;
}
F.Road Series
。。。UESTC和UVALive两个source的题目限时不同,我一直交UESTC,TLE到死。。。。
交了UVALive就A了,我不想再说什么了,无力了~~~~~~
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i<b;++i)
#define N 1000000007
using namespace std;
inline void RD(int &ret)
{char c;do{c=getchar();}while(c<'0'||c>'9');ret=c-'0';while((c=getchar())>='0'&&c<='9'){ret=ret*10+(c-'0');}
}
inline void OT(int a)
{if(a>=10){OT(a/10);}putchar(a%10+'0');
}
set<int>p;
set<int>::iterator it;
string q[1001],ss;
char s[1001];
int k,w,tt;
int main()
{int t,cas=0,m,i,j,l,sum,a,o;bool f;RD(t);while(t--){cas++;scanf("%d%d",&k,&w);gets(s);p.clear();m=0;for(o=0;o<k;++o){gets(s);tt=0;l=strlen(s);ss="";for(j=0; j<l; ++j){if(s[j]>='0'&&s[j]<='9'){ss+=s[j];}else{q[tt++]=ss;ss="";}}if(s[l-1]>='0'&&s[l-1]<='9'){q[tt++]=ss;}while(true){if(p.find(m+1)!=p.end()){p.erase(m+1);++m;continue;}for(i=1; i<=w; ++i){ss="";a=m+i;if(a==0){ss="0";}while(a){ss=char(a%10+48)+ss;a/=10;}f=false;for(j=0; j<tt; ++j){if(q[j].find(ss)!=-1){f=true;break;}}if(f){p.insert(m+i);}}if (p.find(m+ 1)!=p.end()){continue;}break;}}sum=m;for(it=p.begin(); it != p.end(); it++){sum=max(sum,*it);}printf("Case %d: %d %d\n",cas,m,sum);}return 0;
}
G.Show Me the Money
汇率兑换,需要用到弗洛伊德算法求最短路的方式得到兑换方式。。。没考虑太多,居然1A,学长说题目说没有重边,但数据里有。。。额,我也没仔细看太清题目,喜闻乐见了~~~
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i<b;++i)
#define N 1000000007
using namespace std;
inline void RD(int &ret)
{char c;do{c=getchar();}while(c<'0'||c>'9');ret=c-'0';while((c=getchar())>='0'&&c<='9'){ret=ret*10+(c-'0');}
}
inline void OT(int a)
{if(a>=10){OT(a/10);}putchar(a%10+'0');
}
map<string,int>q;
string ss[11];
long long a[11][11];
int ans,m;
string p1,p2,p;
void f()
{int i,j,k,id,num,l;long long sum=-1,in,aa,bb;char h[22];FOR(1,ans,i)//floyd{FOR(1,ans,j){if(i!=j){FOR(1,ans,k){if(i!=k&&j!=k)//去重边{if(a[j][i]==0||a[i][j]==0){continue;}if(a[j][k]!=0){continue;}a[j][k]=a[j][i]*a[i][k];a[k][j]=a[k][i]*a[i][j];}}}}}id=q[p];FOR(1,ans,i){if(i!=id&&a[i][id]!=0){in=(long long)m*a[i][id]/a[id][i];if(in*a[id][i]<(long long)m*a[i][id]){in++;}if(in<=100000){if(sum==-1||in*a[id][i]*bb<sum*aa*a[i][id]){sum=in;num=i;aa=a[id][i];bb=a[i][id];}}}}l=ss[num].size();for(i=0; i<l; ++i){h[i]=ss[num][i];}h[l]=0;printf("%lld %s\n",sum,h);
}
int main()
{int t,i,cas=0,x,y;char s[11],s1[11],s2[11];while(1){RD(t);if(t==0){break;}cas++;q.clear();ans=0;mem(a,0);while(t--){scanf("%d%s%s%d%s",&x,s1,s,&y,s2);p1.assign(s1);p2.assign(s2);if(q[p1]==0)//map去重{q[p1]=++ans;}ss[q[p1]]=p1;if(q[p2]==0){q[p2]=++ans;}ss[q[p2]]=p2;a[q[p1]][q[p2]]=x;a[q[p2]][q[p1]]=y;}scanf("%d%s",&m,s);printf("Case %d: ",cas);p.assign(s);f();}return 0;
}
这次做得还行,但前面的水题出得太慢了,导致其它题也没怎么看。。。
130825组队赛-Regionals 2012, North America - East Central NA相关推荐
- 组队练习赛(Regionals 2012, North America - East Central NA)
A.Babs' Box Boutique 给定n个盒子,每个盒子都有长宽高(任意两个盒子长宽高不完全相同),现在选盒子的任意两面,要求x1 <= x2 && y1 <= y ...
- BNU All Your Base (Regionals 2011, North America - South Central USA) - from lanshui_Yang
[PDF Link] Premise: Given a specification for a "base" (well, actually a mixed radix numbe ...
- 2015 UESTC Winter Training #6【Regionals 2010 North America - Rocky Mountain】
2015 UESTC Winter Training #6 Regionals 2010 >> North America - Rocky Mountain A - Parenthesis ...
- [Recap] ApacheCon North America 2019 完美谢幕
????️本文阅读需 5 分钟 当地时间 9 月 12 日,在拉斯维加斯举行的 ApacheCon North America 2019 完美谢幕. Java 之父 James Gosling 也来到 ...
- East Central North America Region 2015
E 每过一秒,当前点会把它的值传递给所有相邻点,问t时刻该图的值 1 #include <iostream> 2 #include <cstdio> 3 #include &l ...
- 2019 East Central North America 部分题解
题目链接:点这里 A.Retribution! 题意 给出nnn个人的位置.mmm个仓库1的位置以及ppp个仓库2的位置.给每个人分配一个仓库111和仓库222,问这所有的最小距离总和. 解题思路 这 ...
- North America - Greater NY 2012
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 继续发扬AK不了的好传统. 大家都说Greater ...
- 2018 ACM-ICPC North Central North America Regional Contest H.New Salaries
题目:click 题意:一家公司有n个员工,第i个员工的工资范围在[LiL_iLi,RiR_iRi],Li−1<=LiL_{i-1}<=L_iLi−1<=Li,Ri−1< ...
- North America - Greater NY 2013
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove A:直接枚举岛的两个端点,两侧要低,中间部分不能低 ...
最新文章
- php 生成动态键值 数组_你的PHP项目遇到性能问题了吗?看完这篇性能分析恍然大悟...
- jhello框架-ajax
- 认识数据分析_认识您的最佳探索数据分析新朋友
- Python高级数据类型-字符串,列表,元组,字典
- splay学习小记[未完结]
- Testng 运行Cannot find class in classpath
- Dynamic Programming之Longest Increasing Subsequence (LIS)问题
- CodeIgniter学习笔记(六)——CI超级对象中的input输入类
- python isinstance(object, classinfo)
- java 数独 gui,GitHub - fagen/sudoku: 数独终局生成器和GUI
- JAVA 逆向工程技术研究日志
- 网络安全基础问答24例,白帽黑客必备
- 2005年度最佳网名
- Morphia DAOs
- dart后端之jaguar基础配置
- canvas标签设置长宽
- 研究内核安全必读的10本书
- 混迹在腾讯微博的知名站长名单(截至4月28日)
- VMware 装Windows Server 系统
- linux防火墙规则配置教程,linux防火墙iptables详细教程