spoj1182 Sorted bit squence/[USACO2003 Dec]Cow Queueing

2024-05-12 00:08

本文主要是介绍spoj1182 Sorted bit squence/[USACO2003 Dec]Cow Queueing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:SPOJ的->http://www.spoj.com/problems/SORTBIT/

题目大意:

约翰给每头奶牛用一个数字编号,这些奶牛在集合时,会将自己编号转换成二进制表示,并按照以下规则排队:
• 首先,编号的二进制中1 出现次数较少的排在队伍的前面;
• 其次,如果1 的数量一样多,那么编号较小的排在前面;
举个例子,从4 到15,有12 个数字,顺序应该是
100; 1000; 101; 110; 1001; 1010; 1100; 111; 1011; 1101; 1110; 1111
假设编号在A到B之间的所有奶牛都在排队,那么这个队伍中排在第K 位的奶牛编号应该是多少呢?


注意:USACO的保证都是非负数0 ≤A≤B<10^9;而spoj上可能有负数但A,B同正同负 -2^31 ≤ A ≤ B ≤ 2^31-1,而且若为负数,则其二进制与其相反数的二进制的和为2^32。


题解:

组合+二分+数位DP

下面的都是最低位为第0位(还是1..???忘了..自己看)。

设f[i][j][k]表示在0~i中,做到了第j位(二进制),要放k个1有多少种方案(即有多少个这样的数)。

首先,如果i在这位上有1,那么我在这一位取0的话就不在上限边缘,就可以在j-1个位置上随便摆k个1,有C(j-1,k)种方案;而我若取了1,那就为f[i][j-1][k-1]。

而如果i在这位上是0的话,那我也只能取0了啊,所以为f[i][j-1][k]。

这个有什么用呢?

我们先找到排第K位的奶牛有几个1。知道↑之后不用说怎么做吧。

然后在范围[A,B]中二分,使排位不断接近K。因为是用左端点不断靠近答案,所以最后输出l。

USACO的输入输出都是二进制,而spoj的输入输出都是十进制(而且负数要搞回负数..(提醒了我负数这一回事

如果都是负数的话,因为其二进制与其相反数的二进制的和为2^32,那么我们把这个数+2^32,最后再减回来是一样的。

为什么呢?假设这个数为x,相反数为-x,相反数为正数所以是正常的...意思就是(-x)10=(-x)2诶就是说-x的二进制表示的大小和原数相同。

那么 有 -x +(x)2 = 2^32 --> (x)2=x+2^32。

就得到了它的二进制了。其他的照做就好了。 

p.s.下面的代码是spoj的。如果要交USACO的话就把多组数据删了,注释的弄回来,“=====”之间的注释掉。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;LL bit[40],C[40][40];
char s[40];
const LL MX=1LL<<32;
void redc()//预处理组合C(i,j)
{C[0][0]=1;for (int i=1;i<=32;i++){C[i][0]=1;for (int j=1;j<=i;j++)C[i][j]=C[i-1][j]+C[i-1][j-1];}
}
void dels(LL &x)//这是处理二进制输入的
{int len=strlen(s);x=0;for (int i=len-1,k=0;i>=0;i--,k++)x+=bit[k]*(s[i]-'0');
}
LL dfs(LL x,int w,int k)//就是上面说的f[x][w][k]。不过没有存下来而已。意义一样
{if (w==0 && k==0) return 1;if (x<0 || w==0 || k<0) return 0;LL p=1LL<<(w-1);if (x&p) return C[w-1][k]+dfs(x,w-1,k-1);return dfs(x,w-1,k);
}
int main()
{//freopen("cowq.in","r",stdin);//freopen("cowq.out","w",stdout);int i,T;LL l,r,now,sum,K;LL A,B,mid,jl,ind;bit[0]=1;for (i=1;i<=32;i++) bit[i]=bit[i-1]*2;redc();scanf("%d",&T);while (T--){// scanf("%s\n",s);dels(A);// scanf("%s",s);dels(B);//-----------------------scanf("%lld%lld",&A,&B);scanf("%lld",&K);bool pd=0;if (A<0 || B<0) A+=MX,B+=MX,pd=1;if (A>B) {LL t=A;A=B;B=t;}//------------------------sum=now=0;for (i=0;i<=31;i++){now=dfs(B,32,i)-dfs(A-1,32,i);if (sum+now<K) {sum+=now;ind=i;}else {K=K-sum;break;}}ind++;//找排第K的有ind个1l=A;r=B;jl=dfs(A-1,32,ind);while (l<r)//二分{mid=(l+r)>>1;now=dfs(mid,32,ind)-jl;if (now<K) l=mid+1;else r=mid;}//-----------------------if (pd) l=l-MX;printf("%lld",l);//-----------------------// bool pd=0;// for (i=32;i>=0;i--)// if (l&bit[i])// {// printf("1");// pd=1;// }else if (pd) printf("0");printf("\n");}return 0;
}


这篇关于spoj1182 Sorted bit squence/[USACO2003 Dec]Cow Queueing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981046

相关文章

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

LeetCode - 33. Search in Rotated Sorted Array

33. Search in Rotated Sorted Array  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一个数组,这个数组是由两个有序的数组拼接成的(无重复元素),在这个数组中查找元素k的下标. anal

【POJ】3660 Cow Contest floyd(可以拓扑排序?)

Cow Contest Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6925 Accepted: 3792 Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating i

【HDU】5333 Undirected Graph【LCT+BIT】

传送门:【HDU】5333 Undirected Graph my  code: my~~code: #pragma comment(linker, "/STACK:1024000000")#include <stdio.h>#include <string.h>#include <map>#include <algorithm>using namespace std ;typed

【HDU】5574 Colorful Tree【子树染色,询问子树颜色数——线段树+bit+lca+set】

题目链接:【HDU】5574 Colorful Tree 题目大意:对一个子树染色,询问一个子树的颜色数。 题目分析: set set维护每种颜色所在的 dfs dfs序区间,修改均摊 nlogn nlogn。 #include <bits/stdc++.h>using namespace std ;typedef long long LL ;typedef pair < int , i

BFS —— POJ 3278 Catch That Cow

对应POJ题目:点击打开链接 Catch That Cow Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 54686 Accepted: 17096 Description Farmer John has been informed of the location of a fugitive cow

USACO Section 2.3 Cow Pedigrees

题意: N个节点  深度为K  的正则二叉树  求  树有几种形态 思路: 一开始以为是数学题…  看了byvoid的题解才知道是dp… 每棵树由根节点、左子树、右子树构成  由此得状态转移  树=左子树*右子树 节点数和深度是影响答案的属性  所以令dp[i][j]表示i个节点深度在j以内的树的形态数 深度在j以内的树又两个深度在j-1以内的树和一个根节点构成 设左子树k个节

Codeforces 283. B. Cow Program记忆化搜索

output standard output Farmer John has just given the cows a program to play with! The program contains two integer variables, x and y, and performs the following operations on a sequence a1, a2, ..

LeetCode --- Median of Two Sorted Arrays

第一次在csdn上写备忘录,以前一直是在笔记本上写,主要是笔记本上可以随意写,只要自己能看懂,在网页上多少都受些限制,另外一方面也是想锻炼下写作能力,为以后的论文做基础吧!最近偶尔上leetcode练些题目,所以也就以这个为主题写一篇试试看,因为能力不足,理解或言辞上会有错误,还望访者不吝赐教,我定当万分感激。 好了,废话也说完了,现在进入正题: 题目: There are two sor