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. maven pom文件报错:Multiple annotations found at this line 解决方案(转)

    研究maven多模块项目时,因为家里和公司不能同时开发,所以把家里搭建好的项目复制到公司继续研究, 当时家里的电脑搭建好项目之后是没问题的,但是复制到公司的eclipse上之后就看到pom文件出现下面 ...

  2. ubuntu 安装/卸载nginx及常用命令

    安装命令 sudo apt-get update #更新apt sudo apt-get install nginx #安装nginx 启动/重启/停止命令 一. /etc/init.d/nginx ...

  3. 如何使用github来查找自己需要的(关心的)项目

    1.登录github官网 输入用户名密码后会显示下面的界面 2.点击explore git hub 然后你会看到下面的页面 3.下面的或许有你想要的项目 点击Treding 可以查看最近火的项目仓库 ...

  4. C# 基于DocumentFormat.OpenXml的数据导出到Excel

    using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.S ...

  5. 001- CreateProcess failed with error 216 (no message available)错误详解

    问题详解 runnerw.exe: CreateProcess failed with error 216 (no message available) 看描述,创建进程失败,应该是main这个入口文 ...

  6. 2. Python3输入与输出

    数据的输入和输出操作是计算机最基本的操作,本节只研究基本的输入与输出,基本输入是指从键盘上输入数据的操作,基本输出是指屏幕上显示输出结果的操作. 2.1基本输入和输出 常用的输入与输出设备有很多,如摄 ...

  7. git server 配置

    因为后面要采用Git代替Subversion,花了点时间配置了Git服务端和客户端,像以前一样,仍然基于最新的Ubuntu11.10 server/desktop系统. 感谢这几篇文章的作者: htt ...

  8. IFrame session(转)

    问题场景: 在一个应用(集团门户)的某个page中, 通过IFrame的方式嵌入另一个应用(集团实时监管系统)的某个页面. 当两个应用的domain 不一样时, 在被嵌入的页面中Session失效.( ...

  9. STL之Vector容器

    1.Vector容器 1)vector是将元素置于一个动态数组中加以管理的容器. 2)vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). 3)vecto ...

  10. 擠出線寬(Extrusion width),要怎麼設定?

    擠出線寬(Extrusion width),要怎麼設定? Slic3r的作者,把這邊的%設定,跟"層高"做連結.我個人認為擠出線寬,要以噴頭孔徑當做設定參考才好.層高應該只要設定成 ...