topcoder srm 430 div1
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的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- 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)其 ...
随机推荐
- LeetCode119.杨辉三角II
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] 进阶: 你可以优化你的算法到 O ...
- Bukkit插件编程之检测玩家受到的伤害是来自投射类武器还是近身武器
package com.sklm.lhb.listener; import org.bukkit.entity.Arrow; import org.bukkit.entity.Player; impo ...
- Php 通过curl提交post内容为 Json的请求
<?php $data = array("cNos" => array("1064917432615","1064917432615&qu ...
- shader之法线变换
对于法线变换,进行非统一缩放时,如果使用跟变换顶点相同的变换矩阵来变换法线,则会得到错误的结果,即变换后的法线方向与平面不再垂直. 如何求得变换法线的矩阵呢: 转载请注明出处:http://www.c ...
- jQuery属性--html([val|fn])、text([val|fn])和val([val|fn|arr])
html([val|fn]) 概述 取得第一个匹配元素的html内容,这个函数不能用于XML文档.但可以用于XHTML文档. 在一个 HTML 文档中, 我们可以使用 .html() 方法来获取任意一 ...
- python中常见的错误类型
Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个 ,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不用 ...
- linux 虚拟机挂载光驱
step 1 step 2 step 3 挂载 root@vm-xiluhua /dev # mount cdrom /mnt mount: /dev/sr0 写保护,将以只读方式挂载 step 4 ...
- AtCoder Beginner Contest 044 A - 高橋君とホテルイージー / Tak and Hotels (ABC Edit)
Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement There is a hotel with ...
- 51Nod 1212 无向图最小生成树 (路径压缩)
N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 &l ...
- Step6:SQL Server 数据变更时间戳(timestamp)在复制中的运用
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two ...