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. floyed算法

    Floyed算法(实际是动态规划问题) 问题:权值矩阵matrix[i][j]表示i到j的距离,如果没有路径则为无穷 求出权值矩阵中任意两点间的最短距离 分析:对于每一对定点u,v看是否存在一个点w使 ...

  2. eclipse安装PyDev插件出错No software site found at jar:file:[离线包路径]!/. Do you wish to edit the location?

    解决方法是直接将下载的离线包解压,得到plugins和features文件夹,放到Eclipse的dropins目录下.重启Eclipse,PyDev插件即可安装成功. 离线包下载地址:http:// ...

  3. 如何查看.Net源代码vs版本号以及C#项目中各文件的含义

    查看.Net源代码vs版本号以及C#项目中各文件的含义 用记事本打开vs项目的.sln文件. 第2行就是这个源代码包的开发软件vs版本号了 注意了,如果是vs2003的sln文件通常没有这行,可以判断 ...

  4. iOS/Xcode异常:reason = “The model used to open the store is incompatible with the one used to create the store”

    reason=The model used to open the store is incompatible with the one used to create the store 出现上述异常 ...

  5. POJ 1947 - Rebuilding Roads 树型DP(泛化背包转移)..

    dp[x][y]表示以x为根的子树要变成有y个点..最少需要减去的边树... 最终ans=max(dp[i][P]+t)  < i=(1,n) , t = i是否为整棵树的根 > 更新的时 ...

  6. [置顶] linux常用命令手册

    前言:整理了一份linux常用命令手册,与大家分享.这是一些比较常用的命令. 我已经整理成一份PDF带书签的手册,可以到CSDN免费下载. 下载地址:http://download.csdn.net/ ...

  7. Java面试题之一

    下面也将收集一些经典的java面试题,琢磨这些面试题还是非常有好处,可以弄清楚一些容易混淆的知识点,下面面试题的答案部分来自网络,有些来自自己的理解,都是自己精心归纳整理的,有问题的地方,希望大家指出 ...

  8. U3D学习笔记

    1.向量的点乘.叉乘以及归一化的意义 1)点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影 2)叉乘得到的向量垂直于原来的两个向量 3)标准化向量:用在只关系方向,不关心大小的时候 用 ...

  9. 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器

    小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...

  10. eclipse the user operation is waiting for building workspace" to complete

    "the user operation is waiting for building workspace" to complete", 解决办法: 1.选择菜单栏的“P ...