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 ...
- Regionals 2012, North America - Greater NY 解题报告
这套题..除了几何的都出了 完全没时间学几何.杯具 A,B,J 水题不解释 C.Pen Counts 这题的话 写几个不等式限制边得范围就行了 然后枚举最小边 D.Maximum Random Wal ...
- HNU 13064 Cuckoo for Hashing解题报告 North America - East Central 2013
题目大意:使用两个哈希表来解决哈希冲突的问题.假如现在有两个哈希表分别为:H1,H2 ,大小分别为:n1,n2:现有一数据X需要插入,其插入方法为: 1.计算index1 = X MOD N1, 若 ...
- Regionals 2013 :: North America - Southeast USA
Regionals 2013 :: North America - Southeast USA It Takes a Village As a Sociologist, you are studyin ...
- 2015 UESTC Winter Training #6【Regionals 2010 >> North America - Rocky Mountain】
2015 UESTC Winter Training #6 Regionals 2010 >> North America - Rocky Mountain A - Parenthesis ...
- MPI Maelstrom(East Central North America 1996)(poj1502)
MPI Maelstrom 总时间限制: 1000ms 内存限制: 65536kB 描述 BIT has recently taken delivery of their new supercom ...
- ICPC North Central NA Contest 2018
目录 ICPC North Central NA Contest 2018 1. 题目分析 2. 题解 A.Pokegene B.Maximum Subarrays C.Rational Ratio ...
- poj 2732 Countdown(East Central North America 2005)
题意:建一个家庭树,找出有第d代子孙的名字,按照要求的第d代子孙的数从大到小输出三个人名,如果有一样大小子孙数的,就按字母序从小到大将同等大小的都输出,如果小于三个人的就全输出. 题目链接:http: ...
- East Central North America Region 2015
E 每过一秒,当前点会把它的值传递给所有相邻点,问t时刻该图的值 #include <iostream> #include <cstdio> #include <algo ...
随机推荐
- iOS内存管理 ARC与MRC
想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...
- 第2章 Python基础语法 -- 数据类型
2.2数据类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 2.2.1 标准数据类型 在内存中存储 ...
- 替换NavigationController里面的返回按钮
通过navigationController push进来的controller,默认的返回按钮是将本controller pop出去. 但有时候想在pop出去前完成一些自己的一些事情,这时可以自己写 ...
- 转: seajs手册与文档之 -- 快速参考 ( ~~useful )
目录 快速参考 seajs.use seajs.config define require require.async exports module.exports 快速参考 该页面列举了 SeaJS ...
- java实现电脑远程控制完整源代码(转)
Java JDK1.4 的Robot对象,该对象可以完成屏幕图像截取操作,控制鼠标,键盘,如此便可以轻而易举地实现远程服务器的控制.本文向大家介绍如何用Java Robot对象实现远程服务器的控制,并 ...
- slf4j 和 log4j合用的(Maven)配置(转)
简述:添加logger的日志输出,下面是配置信息供备忘 步骤:1. 在Maven的porn.xml 文件中添加dependency如下 <dependency> <groupId&g ...
- 安装ubuntu时的注意事项----个人小总结
今天重装了一次ubuntu,以前是别人帮我装的,而这次是我自己照着网上教程装的. 这个教程还是挺不错的,我就是照着这个装成功的 http://jingyan.baidu.com/article/60c ...
- java学习之IO字符流
package com.io; import java.io.*; /** * 文件字符流的读取 * @author ganhang * */ public class FileReaderDemo ...
- POJ 1741 Tree【Tree,点分治】
树上的算法真的很有意思……哈哈. 给一棵边带权树,问两点之间的距离小于等于K的点对有多少个. 将无根树转化成有根树进行观察.满足条件的点对有两种情况:两个点的路径横跨树根,两个点位于同一颗子树中. 如 ...
- switch case ,while, do while,enum
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_编辑 ...