打卡!

Easy(250pts):

题目大意:一个人心中想了一个数,另一个人进行了n次猜测,每一次第一个人都会告诉他实际的数和猜测的数的差的绝对值是多少,现在告诉你所有的猜测和所有的差,要求你判断心中所想的数是多少,如果无解输出-1,如果有多个解输出-2。数据满足n<=50,想的那个数在[1,10^9]中。

这题是不是很简单呀~

首先通过第一次我们就最多确定两个数了,

然后分别带到后面去看一下就可以了,

时间复杂度O(n),代码如下:

 #include <bits/stdc++.h>
using namespace std;
int n,ans1,ans2;
bool check1=true,check2=true;
class EllysNumberGuessing
{
public:
int getNumber(vector <int> guesses, vector <int> answers)
{
n=guesses.size();
ans1=guesses[]+answers[];
ans2=guesses[]-answers[];
for (int i=;i<n;i++)
{
if (abs(ans1-guesses[i])!=answers[i]) check1=false;
if (abs(ans2-guesses[i])!=answers[i]) check2=false;
}
if (ans1<||ans1>) check1=false;
if (ans2<||ans2>) check2=false;
if (check1&&check2) return -;
if ((!check1)&&(!check2)) return -;
if (check1) return ans1;
if (check2) return ans2;
}
};

Medium(450pts):

题目大意:有n个公司,每个公司去了好多好多人来比赛,每个人的名字是一个小于M的非负整数。现在要两两组队,并且尽可能有更多的组使得同一组的两个人的名字不一样,求最多能组多少对。数据满足n<=50,M<=1073741824且M是一个2的幂次,需要注意的是本题空间限制只有16MB。

矣~这题不是浙江省选期间和吕爷爷讨论的一个ACM题目嘛。。。然而空间只有16MB。。。

我们先不考虑这个16MB的限制,回到题目的本质。

假设一共有x个人,

考虑出现次数最多的一个名字,我们假设它出现了y次。

如果y<=(x+1)/2,那么答案一定就是x/2;

如果y>(x+1)/2,那么答案一定就是x-y。

于是这样原题就做完了。

考虑那个恶心的16MB,我们显然不能把所有的名字全部预处理出来,不然就爆炸啦~

我们发现我们只需要比较出现最多的数是否出现了超过一半,

这个时候我们就想到了杜教主冬令营上讲的一个并行算法题目的做法,

设当前出现次数最多的为x,出现了y次。

如果当前的数等于x,那么y加上1;

如果当前的数不等于x,如果y=0那么x更换成新的值,不然的话y减去1.

在最后我们还需要检验一下当前的数是否超过了一半,这样我们就可以在O(n)的时间复杂度内用额外O(1)的空间复杂度完成任务。

于是顺利12MB卡过~

时间复杂度O(n),代码如下:

 #include <bits/stdc++.h>
using namespace std;
int n;
class EllysPairing
{
public:
int getMax(int M, vector <int> count, vector <int> first, vector <int> mult, vector <int> add)
{
//now is the name apeears most while cnt represents how many times it appears
//tot means how many people are there in all
int now=,cnt=,tot=,t;
n=count.size();
for (int i=;i<n;i++)
{
t=first[i],tot+=count[i];
for (int j=;j<count[i];j++)
{
if (t==now) ++cnt;
else
{
if (cnt==) now=t,cnt=;
else --cnt;
}
if (j<count[i]-) t=(t*mult[i]+add[i])&(M-);
}
}
cnt=;
for (int i=;i<n;i++)
{
t=first[i];
for (int j=;j<count[i];j++)
{
if (t==now) ++cnt;
if (j<count[i]-) t=(t*mult[i]+add[i])&(M-);
}
}
if (cnt<=(tot+)/) return tot/;
return tot-cnt;
}
};

Hard(950pts):

题目大意:给出三维空间中的n个点,从中选出若干个点,如果这些点都在某一个立方体的8个顶点上,那么这些点就称为一个好的组合,问一共有多少个好的组合。数据满足n<=50,n个点互不相同且一定都是整点。需要注意的是,立方体是可以旋转的。

首先我们分析一下,所有满足条件的立方体不是很多,所以最后的答案也不是很多,直接搜索即可。

考虑满足条件的立方体,它的边长一定是某两点距离的1倍或1/sqrt(2)倍或1/sqrt(3)倍。(还有可能是0)

于是我们用一个2^n的数来表示每个点是否被加入,于是直接统计答案就可以了。

复杂度O(n^4)(大概吧,反正跑得过),代码如下:

 #include <bits/stdc++.h>
#define Maxn 57
using namespace std;
int n;
long long dis[Maxn][Maxn];
multiset<long long> st,ans;
map<long long,bool> vis;
class Subcube
{
void dfs(int x, long long state, long long len)
{
//x means which point is being dealed now
//state means the situation of the point(belonged to the cubic or not)
//len means the length of an edge of the cubic
if (x==n)
{
if (!vis[state]) ans.insert(state),vis[state]=true;
} else
{
//x doesn't belong to the cubic
dfs(x+,state,len);
//x belongs to the cubic
for (int i=;i<n;i++)
if ((state>>i)%==)
{
long long r1=dis[i][x];
if (r1!=len&&r1!=len*&&r1!=len*) return;
for (int j=;j<n;j++)
if (((state>>j)%==)&&(j!=i))
{
long long r2=r1+dis[i][j]+dis[j][x];
if (r2!=*len&&r2!=*len) return;
}
}
dfs(x+,state+(1LL<<x),len);
}
}
public:
long long getCount(vector <int> X, vector <int> Y, vector <int> Z)
{
n=X.size();
st.clear();
for (int i=;i<n;i++)
for (int j=;j<n;j++)
dis[i][j]=1LL*(X[i]-X[j])*(X[i]-X[j])+1LL*(Y[i]-Y[j])*(Y[i]-Y[j])+1LL*(Z[i]-Z[j])*(Z[i]-Z[j]);
for (int i=;i<n;i++)
for (int j=i+;j<n;j++)
{
st.insert(dis[i][j]);
if (dis[i][j]%==) st.insert(dis[i][j]/);
if (dis[i][j]%==) st.insert(dis[i][j]/);
}
st.insert();
ans.clear();
for (multiset<long long>::iterator it=st.begin();it!=st.end();it++)
dfs(,,*it);
return ans.size()-;
}
};

Topcoder SRM 606 div1题解的更多相关文章

  1. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  2. Topcoder SRM 607 div1题解

    好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数 ...

  3. Topcoder SRM 608 div1 题解

    Easy(300pts): 题目大意:有n个盒子,一共有S个苹果,每个盒子有多少个苹果不知道,但是知道每个盒子的苹果下限和上限.现在要至少选择X个苹果,问如果要保证无论如何都能获得至少X个苹果,至少需 ...

  4. Topcoder SRM 605 div1 题解

    日常打卡- Easy(250pts): 题目大意:你有n种汉堡包(统统吃掉-),每一种汉堡包有一个type值和一个taste值,你现在要吃掉若干个汉堡包,使得它们taste的总和*(不同的type值的 ...

  5. Topcoder SRM 604 div1题解

    CTSC考完跑了过来日常TC--- Easy(250pts): 题目大意:有个机器人,一开始的位置在(0,0),第k个回合可以向四个方向移动3^k的距离(不能不动),问是否可以到达(x,y),数据满足 ...

  6. Topcoder SRM 603 div1题解

    昨天刚打了一场codeforces...困死了...不过赶在睡前终于做完了- 话说这好像是我第一次做250-500-1000的标配耶--- Easy(250pts): 题目大意:有一棵树,一共n个节点 ...

  7. Topcoder SRM 601 div1题解

    日常TC计划- Easy(250pts): 题目大意:有n个篮子,每个篮子有若干个苹果和橘子,先任取一个正整数x,然后从每个篮子中选出x个水果,把nx个水果放在一起,输出一共有多少种不同的组成方案.其 ...

  8. Topcoder SRM 600 div1题解

    日常TC计划正式启动! Easy(250pts): 题目大意:给你一个集合,里面一堆数,初始数为0,给你一个目标数,你可以选择集合中若干个数进行OR操作来得到目标数.问至少删去多少个数,使得你永远无法 ...

  9. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

随机推荐

  1. 英文缩写SFR

    英文缩写为SFR,是Special Function Register(特殊功能寄存器)的缩写.

  2. oracle11g导出表时空表导不出解决方案

    oracle11g用exp命令导出数据库表时,有时会发现只导出了一部分表时而且不会报错,原因是有空表没有进行导出,之前一直没有找到方法于是用最笨的方法重新建这些空表,当然在我们实际当中表的数量大时我们 ...

  3. selenium+PhantomJS 抓取淘宝搜索商品

    最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...

  4. dubbo的rpc异常

    Exception in thread "main" com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method ...

  5. Android 网络通用类 NetUtil

    1.整体分析 1.1.源代码如下,可以直接Copy. public class NetUtil { /** * 用户是否连接网络 * * @param context Context */ publi ...

  6. [bzoj2733]永无乡&&[bzoj3545]Peaks

    并不敢说完全会了线段树合并,只是至少知道原理写法了...还是太菜了,每天被大佬吊锤qwq 我看到的几道线段树合并都是权值线段树的合并.这个算法适用范围应该只是01线段树的. 这两道算入门题了吧... ...

  7. P1330 封锁阳光大学(染色问题)

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  8. 四大关键步骤掌握CloudOps模型

    [TechTarget中国原创] 要让IT运维向云演进,企业必须拥抱自动化,并且改变资源预配的思考方式. 新涌现的术语CloudOps——云运维的简写,指代企业如何运行以及管理基于云的系统.并且,随着 ...

  9. 解决 ld: library not found for -lPods的问题

    现在打开有pods建好的workspace文件,尝试编译,会报ld: library not found for -lPods错误,原因就是工程里面的设置项覆盖了pods中xcconfig中的设置.解 ...

  10. linux统计分析流量-wireshark

    wireshark是一款带界面的开源抓包工具,可以用来对系统流量进行统计分析. 安装 由于wireshark是带界面的,所以一般在界面环境下运行,可以通过yum安装: $ yum install -y ...