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的更多相关文章

  1. 组队练习赛(Regionals 2012, North America - East Central NA)

    A.Babs' Box Boutique 给定n个盒子,每个盒子都有长宽高(任意两个盒子长宽高不完全相同),现在选盒子的任意两面,要求x1 <= x2 && y1 <= y ...

  2. Regionals 2012, North America - Greater NY 解题报告

    这套题..除了几何的都出了 完全没时间学几何.杯具 A,B,J 水题不解释 C.Pen Counts 这题的话 写几个不等式限制边得范围就行了 然后枚举最小边 D.Maximum Random Wal ...

  3. HNU 13064 Cuckoo for Hashing解题报告 North America - East Central 2013

    题目大意:使用两个哈希表来解决哈希冲突的问题.假如现在有两个哈希表分别为:H1,H2 ,大小分别为:n1,n2:现有一数据X需要插入,其插入方法为: 1.计算index1 = X MOD N1,  若 ...

  4. Regionals 2013 :: North America - Southeast USA

    Regionals 2013 :: North America - Southeast USA It Takes a Village As a Sociologist, you are studyin ...

  5. 2015 UESTC Winter Training #6【Regionals 2010 >> North America - Rocky Mountain】

    2015 UESTC Winter Training #6 Regionals 2010 >> North America - Rocky Mountain A - Parenthesis ...

  6. MPI Maelstrom(East Central North America 1996)(poj1502)

    MPI Maelstrom 总时间限制:  1000ms 内存限制:  65536kB 描述 BIT has recently taken delivery of their new supercom ...

  7. ICPC North Central NA Contest 2018

    目录 ICPC North Central NA Contest 2018 1. 题目分析 2. 题解 A.Pokegene B.Maximum Subarrays C.Rational Ratio ...

  8. poj 2732 Countdown(East Central North America 2005)

    题意:建一个家庭树,找出有第d代子孙的名字,按照要求的第d代子孙的数从大到小输出三个人名,如果有一样大小子孙数的,就按字母序从小到大将同等大小的都输出,如果小于三个人的就全输出. 题目链接:http: ...

  9. East Central North America Region 2015

    E 每过一秒,当前点会把它的值传递给所有相邻点,问t时刻该图的值 #include <iostream> #include <cstdio> #include <algo ...

随机推荐

  1. myEclipse快捷键及其常用设置

    快捷键:    查找替换:ctrl + f    复制行: ctrl + alt + down    删除行: ctrl + d    插入行: shift + enter, ctrl + shift ...

  2. PHP学习笔记9-生成图片

    用PHP代码在网页上生成图片 <?php /** * Created by PhpStorm. * User: Administrator * Date: 2015/6/29 * Time: 2 ...

  3. RMAN多种备份脚本分享

    1.相关参数介绍: 命令行参数 描述 TARGET 为目标数据库定义的一个连接字符串,当连接到一个目标数据库时,该连续是SYSDBA连接.该用户拥有启动和关闭数据库的权利,必须属于OSDBA组,必须建 ...

  4. IT第八天 - 类的应用、debug、项目开发模式优化

    IT第八天 上午 类的应用 1.对象在实例化时是非常耗费系统资源的,因此要尽量减少new字段的使用 2.类的初始值是null,在使用未实例化的类时,很容易导致报错:NullExceptionPoint ...

  5. [上海] 携程 门票事业部 招聘.NET 架构师 2 名 - V2EX

    [上海] 携程 门票事业部 招聘.NET 架构师 2 名 - V2EX [上海] 携程 门票事业部 招聘.NET 架构师 2 名

  6. C++ 学习笔记3,struct长度測试,struct存储时的对齐方式

    之所以专门为struct的长度写一篇測试,是由于原来c++对于struct的变量, 在分配内存的时候,c++对struct有一种特殊的存储机制. 看以下的測试: 一.在Windows7 32bit , ...

  7. SeekBar 样式设置

    1 SeekBar简介 SeekBar是进度条.我们使用进度条时,可以使用系统默认的进度条:也可以自定义进度条的图片和滑块图片等. 2 SeekBar示例 创建一个activity,包含2个SeekB ...

  8. 解决 Xcode7 中多个模拟器的办法

    转自: http://www.oschina.net/code/snippet_196012_50574 1.关闭xcode 2.终端输入 sudo killall -9 com.apple.Core ...

  9. 利用VC助手(VA)添加注释

    利用VC助手(VA)添加注释 今天想给自己写的代码加上版权信息,同时整理一下代码的注释.但是为了保持同样的格式,总是copy,显得有些繁琐.然后试图找解决方案.我用的是VS 2010, 刚开始是尝试了 ...

  10. BZOJ 2599: [IOI2011]Race( 点分治 )

    数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...