problem1 link

其实就是找到一个数字$t$,使得$x$的二进制为1 的位上$t$也都为1。然后$t$删掉所有那些$x$为1的二进制位就是$k$。

problem2 link

设所有合法的边的个数为$m(m \leq C_{10}^{2}=45)$。状态$mask$记录每个点的度数。$f[i][j]$表示处理到第$i$条边,目前每个点度数的状态为$j$ 的最小距离。不需要记录选的边的个数是因为可以从$j$推算出来。

problem3 link

将$n$平分为前一半后一半,两边分别暴力枚举出每种选择的差值。

统计答案的时候只需要枚举一侧(假设差值为$x$,某一个集合里的已选的个数为$t$),然后在另一侧寻找选到该集合个数为$\frac{n}{2}-t$且差值最接近$-x$,然后更新答案即可。

code for problem1

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class BitwiseEquations { public long kthPlusOrSolution(int x, int k) {
long result=0;
long t=x;
int cur=0;
int m=30;
while(0==(k&(1<<m))) {
--m;
}
for(int i=0;i<=m;++i) {
while((t&(1l<<cur))!=0) {
++cur;
}
if((k&(1<<i))!=0) {
result|=1l<<cur;
}
++cur;
}
return result;
}
}

  

code for problem2

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class TwinTowns { public int[] optimalTwinTowns(int[] x,int[] y, int maxPartners, int minDistance) {
final int n=x.length; List<Integer> pairs=new ArrayList<>(); for(int i=0;i<n;++i) {
for(int j=i+1;j<n;++j) {
if(dist(i,j,x,y)>=minDistance) {
pairs.add(i*100+j);
}
}
}
final int M=1<<(n<<1);
int[][] f=new int[2][M];
int pre=0,cur=1;
for(int i=1;i<M;++i) {
f[0][i]=-1;
}
for(int i=1;i<=pairs.size();++i) {
final int p1=pairs.get(i-1)/100;
final int p2=pairs.get(i-1)%100;
for(int j=0;j<M;++j) {
f[cur][j]=f[pre][j];
}
for(int j=0;j<M;++j) {
if(f[pre][j]!=-1) {
int nj=add(j,p1,p2,maxPartners);
if(nj!=-1&&(f[cur][nj]==-1||f[cur][nj]>f[pre][j]+dist(p1,p2,x,y))) {
f[cur][nj]=f[pre][j]+dist(p1,p2,x,y);
}
}
}
pre^=1;
cur^=1;
}
int maxEdges=-1;
int minSumDist=0;
for(int i=0;i<M;++i) {
if(f[pre][i]!=-1) {
final int e=getEdges(i);
if(e>maxEdges) {
maxEdges=e;
minSumDist=f[pre][i];
}
else if(e==maxEdges&&f[pre][i]<minSumDist) {
minSumDist=f[pre][i];
}
}
}
return new int[]{maxEdges,minSumDist};
} int getEdges(int mask) {
int sum=0;
while(mask!=0) {
sum+=mask&3;
mask>>=2;
}
return sum>>1;
} int add(int mask,int t1,int t2,int maxPartners) {
for(int i=0;i<2;++i) {
final int pos=i==0?t1:t2;
final int x=getBit(mask,pos)+1;
if(x>maxPartners) {
return -1;
}
mask=reset(mask,pos,x);
}
return mask;
} int getBit(int mask,int pos) {
return (mask>>(pos<<1))&3;
}
int reset(int mask,int pos,int val) {
mask=mask^(((mask>>(pos<<1))&3)<<(pos<<1));
return mask|(val<<(pos<<1));
} int dist(int i,int j,int[] x,int[] y) {
return Math.abs(x[i]-x[j])+Math.abs(y[i]-y[j]);
}
}

  

code for problem3

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class PickingUp { static class pair {
public int mask;
public long delta; public pair() {
mask=0;
delta=0;
}
} static class MyComparator implements Comparator<pair> {
public int compare(pair a,pair b) {
if(a.delta!=b.delta) {
return a.delta<b.delta?-1:1;
}
return a.mask<b.mask?-1:1;
}
} public int[] fairPickingUp(long[] score1, long[] score2) {
final int n=score1.length>>1;
List<List<pair>> list1=new ArrayList<>();
List<List<pair>> list2=new ArrayList<>();
for(int i=0;i<=n;++i) {
list1.add(new ArrayList<>());
list2.add(new ArrayList<>());
}
int[] f=new int[1<<n];
for(int i=1;i<(1<<n);++i) {
f[i]=f[i>>1]+(i&1);
}
for(int i=0;i<(1<<n);++i) {
for(int k=0;k<2;++k) {
final int start=k==0?0:n;
pair p=new pair();
p.mask=i;
for(int j=0;j<n;++j) {
if((i&(1<<(n-1-j)))==0) {
p.delta-=score1[j+start];
}
else {
p.delta+=score2[j+start];
}
}
if(k==0) {
list1.get(f[i]).add(p);
}
else {
list2.get(f[i]).add(p);
}
}
}
MyComparator comparator=new MyComparator();
for(int i=0;i<=n;++i) {
Collections.sort(list1.get(i),comparator);
Collections.sort(list2.get(i),comparator);
}
list1=unique(list1);
long minMask=-1;
long minCost=1l<<61;
for(int i=0;i<=n;++i) {
for(int j=0;j<list2.get(i).size();++j) {
if(j!=0&&list2.get(i).get(j-1).delta==list2.get(i).get(j).delta) {
continue;
}
final int pos=search(list1.get(n-i),-list2.get(i).get(j).delta);
if(pos==-1) {
continue;
}
for(int k=0;k<2;++k) {
if(pos+k<list1.get(n-i).size()) {
pair q=list1.get(n-i).get(pos+k);
final long cost=Math.abs(q.delta+list2.get(i).get(j).delta);
final long mask=((long)q.mask<<n)|list2.get(i).get(j).mask;
if(cost<minCost||cost==minCost&&mask<minMask) {
minCost=cost;
minMask=mask;
}
}
}
}
} int[] result=new int[n<<1];
for(int i=n+n-1;i>=0;--i) {
if((minMask&(1l<<i))==0) {
result[n+n-1-i]=1;
}
else {
result[n+n-1-i]=2;
}
}
return result;
} List<List<pair>> unique(List<List<pair>> lists) {
List<List<pair>> result=new ArrayList<>();
for(int i=0;i<lists.size();++i) {
result.add(new ArrayList<>());
}
for(int i=0;i<lists.size();++i) {
if(lists.get(i).size()==0) {
continue;
}
result.get(i).add(lists.get(i).get(0));
for(int j=1;j<lists.get(i).size();++j) {
if(lists.get(i).get(j-1).delta!=lists.get(i).get(j).delta) {
result.get(i).add(lists.get(i).get(j));
}
}
}
return result;
} int search(List<pair> list,long delta) {
final int s=list.size();
if(s==0) {
return -1;
}
if(list.get(0).delta>=delta) {
return 0;
}
if(list.get(s-1).delta<=delta) {
return s-1;
}
int low=0,high=s-1,result=0;
while(low<=high) {
int mid=(low+high)>>1;
if(list.get(mid).delta<=delta) {
result=Math.max(result,mid);
low=mid+1;
}
else {
high=mid-1;
}
}
return result;
}
}

  

topcoder srm 430 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

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

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

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

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. itextsharp display:none无效的bug

    在使用itextsharp实现 html 2 pdf时,发现display:none无效.如 <div style="display: none">应该隐藏</d ...

  2. Nginx常用功能

    3.Nginx常用功能 3.1 反向代理服务器 3.1.1.demo2 a.我在tomcat下部署了一个javaweb项目,tomcat安装的服务器IP为:192.168.37.136,部署的项目在t ...

  3. centos中yum命令删除还原的补救方法介绍

    前言 yum,是Yellow dog Updater Modified的简称,起初是由yellow dog这一发行版的开发者Terra Soft研发,用python写成,那时还叫做yup(yellow ...

  4. Spring boot FastJson

    介绍:FastJson 是ailibaba 的一款解析Json的开源框架 使用方式1 引入jar 包 <dependency>    <groupId>com.alibaba& ...

  5. Spring源码阅读(三)

    上一讲我们谈到单例生产关键方法getSingleton.getSingleton方法由DefaultSingletonBeanRegistry类实现.我们的抽象工厂AbstractBeanFactor ...

  6. 通过Hive将数据写入到ElasticSearch

    我在<使用Hive读取ElasticSearch中的数据>文章中介绍了如何使用Hive读取ElasticSearch中的数据,本文将接着上文继续介绍如何使用Hive将数据写入到Elasti ...

  7. 【Alpha版本】冲刺阶段——Day3

    [Alpha版本]冲刺阶段--Day3 阅读目录 今日进展 问题困难 明日任务 今日贡献量 TODOlist [今日进展] 密码算法方面: 参考了md5/sha1+salt和Bcrypt后,我们决定使 ...

  8. Linux基础命令---显示登录用户logname

    logname 显示当前登录的用户名称.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法        logname   2 ...

  9. Python数据类型深入学习之数字

    一. 数字常量 1. 下面来看看Python的数字常量中都要哪些类型: 数字 常量 129,-89,0 一般整数 9999848499999L,4594646469l 长整型数(无限大小) 1.232 ...

  10. 吴恩达讲了干货满满的一节全新AI课,全程手写板书充满诚意非常干货

    吴恩达讲了干货满满的一节全新AI课,全程手写板书充满诚意非常干货 摘要: 目前,AI技术做出的经济贡献几乎都来自监督学习,也就是学习从A到B,从输入到输出的映射.现在,监督学习.迁移学习.非监督学习. ...