题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4712

题目大意:

求n个20位0、1二进制串中,两两抑或最少的1的个数。

解题思路:

两种解法:

1、20位 一共有1<<20个状态,先预处理1的个数,并把相同的1的个数的状态放到一个集合里。根据0和其它数抑或得相同,1和其它数抑或得反,从小到大枚举1的个数的状态P,用其中一个串A来和P相抑或,得到B ,如果B在给定的串中,说明A^B中1的个数为P中1的个数。

这种解法的最坏时间复杂度为C(20,10)*n*20  很暴力,数据很弱。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x3fffffff
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; #define Maxn 110000
//0和a抑或得相同
//1和a抑或得相反
bool hav[1<<20];
vector<int>myv[25]; //myv[i]表示含有i个1的状态
int sa[Maxn]; int main()
{
int t,n; for(int i=0;i<(1<<20);i++)
{
int num=0;
for(int j=0;j<20;j++)
if(i&(1<<j))
num++;
myv[num].push_back(i); //含1的个数相同的状态放到一个集合里
}
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(hav,false,sizeof(hav));
bool flag=false;
for(int i=1;i<=n;i++)
{
scanf("%X",&sa[i]);
if(hav[sa[i]])
flag=true;
else
hav[sa[i]]=true;
}
if(flag)
{
puts("0");
continue;
}
for(int i=1;i<=20&&!flag;i++)
for(int j=1;j<=n&&!flag;j++)
{
for(int k=0;k<myv[i].size()&&!flag;k++)
{
if(hav[sa[j]^myv[i][k]])
{
printf("%d\n",i);
flag=true;
}
}
}
}
return 0;
}

2、因为最终结果肯定在1~20之间,结果域较小。得到结果的概率较大,所以随机两个串的标号,直接计算就可以,随机1000000次。预处理会减少枚举次数。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x3fffffff
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; #define Maxn 110000
int sa[Maxn];
bool hav[1<<20]; int Cal(int a)
{
int res=0; while(a)
{
if(a&1)
res++;
a>>=1;
}
return res;
}
int main()
{
int t,n; scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(hav,false,sizeof(hav));
bool flag=false;
for(int i=1;i<=n;i++)
{
scanf("%X",&sa[i]);
if(hav[sa[i]])
flag=true;
else
hav[sa[i]]=true;
}
if(flag)
{
printf("0\n");
continue;
}
int ans=20;
// srand((unsigned)time(NULL));
for(int i=1;i<=1000000;i++)
{
int j=rand()%n+1;
int k=rand()%n+1;
if(j==k)
continue;
ans=min(ans,Cal(sa[j]^sa[k]));
}
printf("%d\n",ans); }
return 0;
}

暴力或随机-hdu-4712-Hamming Distance的更多相关文章

  1. hdu 4712 Hamming Distance(随机函数暴力)

    http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

  2. hdu 4712 Hamming Distance 随机

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  3. hdu 4712 Hamming Distance ( 随机算法混过了 )

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  4. HDU 4712 Hamming Distance(随机算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 解题报告:输入n个数,用十六进制的方式输入的,任意选择其中的两个数进行异或,求异或后的数用二进制 ...

  5. HDU 4712 Hamming Distance(随机算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 题目大意:任意两个数按位异或后二进制中含1的个数被称为海明距离,给定n个数,求出任意其中两个最小 ...

  6. hdu 4712 Hamming Distance(随机数法)

    d.汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量, 我们以d(x,y)表示两个字x,y之间的汉明距离.对两个字符串进行异或运算,并统计结果为 ...

  7. hdu 4712 Hamming Distance bfs

    我的做法,多次宽搜,因为后面的搜索扩展的节点会比较少,所以复杂度还是不需要太悲观的,然后加上一开始对答案的估计,用估计值来剪枝,就可以ac了. #include <iostream> #i ...

  8. hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

  9. HDU 4217 Hamming Distance 随机化水过去

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  10. HDU 472 Hamming Distance (随机数)

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) To ...

随机推荐

  1. IT第二十天 - 面向对象编程思想、抽象类、异常处理、程序操作日志记录、本周总结 ★★★

    IT第二十天 上午 面向对象编程思想 1.组装电脑的设计: (1)电脑的组成:显示器+机箱 (2)机箱的组成:电源+主板+硬盘 (3)主板所包含的部件:cpu+内存+PCI接口+usb接口 (4)PC ...

  2. 服务器端开发(Python/C++)-今日头条-拉勾网-最专业的互联网招聘平台

    服务器端开发(Python/C++)-今日头条-拉勾网-最专业的互联网招聘平台 服务器端开发(Python/C++)

  3. 高级爬虫工程师(Spider)-美团网-拉勾网-最专业的互联网招聘平台

    高级爬虫工程师(Spider)-美团网-拉勾网-最专业的互联网招聘平台 高级爬虫工程师(Spider)

  4. c# .net 读取json 字符串 与序列化和反序列化json字符串

    命名空间 using Newtonsoft.Json.Linq; JObject obj = JObject.Parse("json字符串");用 obj["" ...

  5. java字符串输出

    package mytest; public class Mycode { public static void main(String[] args){ String[]seasons = {&qu ...

  6. ios多视图开发中:xib与UIViewController的关联

    个人感觉ios中的UIViewController和xib文件,分别相当于android的Activity 和Layout文件 当时两者的关联比android稍微复杂些. ios上分别新建的UIVie ...

  7. jquery删除动态增加的li

    <script type="text/jscript"> //楼主帮你修改调整了下 $(document).ready(function () { $('.zuo li ...

  8. 基于html5 localStorage , web SQL, websocket的简单聊天程序

    new function() { var ws = null; var connected = false; var serverUrl; var connectionStatus; var send ...

  9. AsyncTask使用须知

    AsyncTask的实现原理就是封装了的线程池,详细见AsyncTask实现原理. 在1.5中初始引入的时候, AsyncTask 运行( AsyncTask.execute() )起来是顺序的,当同 ...

  10. RelativeLayout的一些感想

    1.如果只是是3-4个线性,则可以考虑RelativeLayout;多于等于5个还是尽量考虑LinearLayout好 补充:如果要把RelativeLayout作为线性布局的话,可以采用不断设置be ...