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. 设计模式值六大原则——设计模式之六大原则——单一职责原则(SRP)

    定义: 应该有且仅有一个原因引起类的变更. There should never be more than one reason for a class to change. 优点: 1.类的复杂性降 ...

  2. C#学习日记之数据库连接

    一.webconfig设置和参数解释 在C#中新建一个网站时,webconfig文件中会有一个默认的数据库连接语句,如下 <connectionStrings> <add name= ...

  3. python2.5_1.5_通过指定的端口和协议找到服务名

    代码如下: # -*- coding: utf-8 -*- import socket def find_service_name(): protocolname = 'tcp' for port i ...

  4. office2013破解工具

    终于找到破解工具了,每次打开word文档都弹出限期激活对话框,真的是相当烦躁啊,先把破解工具奉上!!!! 工具名: HEU-KMS-ActivatorV1.1绿色版 链接: office2013 和 ...

  5. CentOS 6.5(64bit)安装GCC4.8.2+Qt5.2.1(替换GCC的链接库)

    截至目前,Qt的最新版本为5.2.1,CentOS的版本为6.5,GCC的版本为4.8.2,经过一番尝试,终于将Qt开发环境安装到了CentOS(64 bit)中,整个过程中有几个需要注意的地方,在这 ...

  6. DELPHI编写服务程序总结

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  7. Android中如何判断是否联网

    首先在AndroidManifest.xml中添加与连接网络相关的权限: [xhtml]  view plain copy   <uses-permission android:name=&qu ...

  8. Spring (一) IOC ( Inversion Of Control )

    前序 现在小米手机很火就还拿小米手机来举例子,上一篇写的关于SSH框架搭建是从小米手机公司内个整个流程方面来考虑,如何提高效率生产效率,这篇博客主要从公司外部环境说明如何提高生产效率,那么怎么才能提高 ...

  9. android取得所在位置的经纬度

    android提供了LocationManager来取得位置,用LocationListener来监听位置的变化 先做一些初始化工作: /** latitude and longitude of cu ...

  10. NGUI HUDText

    今天使用HUDText的时候,发现须要如今场景里创建一个UI2dRoot;不然位置不对 或许应该创建一个prefab这样每一个场景都加入一个就可以. using UnityEngine;       ...