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. Yii2 数据操作DAO

    参考: http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.dao http://blog.csdn.net/hzqghost/artic ...

  2. git 使用详情

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  3. python2.7_2.2_在套接字服务器上使用ForkingMixIn

    Linux系统下才能用本程序.因为有Frok新的进程.... 代码如下: # -*- coding: utf-8 -*- import os import socket import threadin ...

  4. C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码

    extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h>   功能:由src所指内存 ...

  5. java.lang.Math类,方法学习笔记

    /**java.lang 包中的Math 类提供有常量 * 并包含有用于执行基本数学运算的 * 方法,如初等指数.对数.平方根 * 用于进行更高级的数学运算.由于 * 在Math 类的方法都是静态的, ...

  6. Apache BeanUtils 1.9.2 官方入门文档

    为什么需要Apache BeanUtils? Apache BeanUtils 是 Apache开源软件组织下面的一个项目,被广泛使用于Spring.Struts.Hibernate等框架,有数千个j ...

  7. Dijkstra 模板 最短路

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents ------------------------------------------ ...

  8. Dalvik虚拟机的优化机制

    Dalvik虚拟机设计作为Android系统定制虚拟机, 在移动设备上运行,必须要比普通的Java虚拟机有更多的优化手段和机制, 以下就列举出其中主要的一些优化机制: 1. 使用dex格式的类文件,可 ...

  9. ceph存储之查找对象

    对象存储(而非块存储): 要把对象存入ceph集群,客户端必须做到: 1.指定对象名 2.指定存储池 Ceph客户端检出最新集群运行图,客户端用CRUSH算法动态地计算出如何把对象映射到归置组.然后计 ...

  10. C#中的DataTable简单使用Merge

    //不同结构的DataTable追加第二个DataTable数据在对应行后的 简单使用//不同结构的DataTable追加在行后面的合并 DataTable dt = new DataTable(); ...