uva--10718+贪心

题意:

输入n,L,U,在L,U之间找一个数M使得n与M按位或的值最大,如果有多个M输出最小的那个。

思路:

将数化成二进制再结合或的性质就可以很容易得到一个贪心的策略:将n化为32位的二进制表示后

对于n中为0的位,使得M对应的二进制位为1.这样显然可以使得n|M值最大,但是同时还要考虑区间的限制;

n中二进制为0时,M对应的二进制位取1的条件是:必须保证后面M的最小值小于U,否则取0;n中二进制为1时,如果

M中对应位取0,则必须保证对应的M最大值要大于L,否则就要取1;

代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;

#define LL long long

int main()
{
      LL n,L,R,a[100];
      int i,j;
      while(scanf("%lld%lld%lld",&n,&L,&R)!=EOF)
      {
               LL sum=0,min1,max1;
               int k=0;
               memset(a,0,sizeof(a));
               while(n)
               {
                     a[k++]=n%2;
                     n=n/2;
               }
               k=32;
               for(i=k-1;i>=0;i--)
               {
                   if(!a[i]&&sum+pow(2,i)<=R)
                          sum+=pow(2,i);
                   else
                   {
                           max1=sum+pow(2,i)-1;
                          if(max1<L)
                                sum+=pow(2,i);
                   }
               }
               printf("%lld\n",sum);
      }
 return 0;
}
时间: 2024-12-21 18:46:00

uva--10718+贪心的相关文章

uva 10718 Bit Mask (位运算)

uva 10718 Bit Mask In bit-wise expression, mask is a common term. You can get a certain bit-pattern using mask. For example, if you want to make first 4 bits of a 32-bit number zero, you can use 0xFFFFFFF0 as mask and perform a bit-wise AND operation

uva 10718 Bit Mask(位操作贪心)

这道题目我没怎么想就去看题解了,原因只是因为我觉得我想不出来,真没有自信啊...唉,真没有钻入题目进去的 恒心...慢慢培养,不能再这样了,不能轻易看题解啊... 分析: 首先题目中已经说了枚举肯定会超时的,所以呢,网上看到的是枚举32比特位,然后和n与,来判断当前位是1还是0, 如果是0的话,就换成1,除非换成1后比区间的最大值还要大.因为换成一能保证最后或的结果最大. 如果是1的话,就换成0(这样能保证结果相同的情况下选的数最小)除非换成0后它的最大值比区间最小值还要小,就 是说当前位后面所

01_传说中的车(Fabled Rooks UVa 11134 贪心问题)

问题来源:刘汝佳<算法竞赛入门经典--训练指南> P81: 问题描述:你的任务是在n*n(1<=n<=5000)的棋盘上放n辆车,使得任意两辆车不相互攻击,且第i辆车在一个给定的矩形R之内. 问题分析:1.题中最关键的一点是每辆车的x坐标和y坐标可以分开考虑(他们互不影响),不然会变得很复杂,则题目变成两次区间选点问题:使得每辆车在给定的范围内选一个点,任何两辆车不能选同一个点.  2.本题另外一个关键点是贪心法的选择,贪心方法:对所有点的区间,按右端点从小到大排序:每次在一个区间

UVa 11389 (贪心) The Bus Driver Problem

题意: 有司机,下午路线,晚上路线各n个.给每个司机恰好分配一个下午路线和晚上路线. 给出行驶每条路线的时间,如果司机开车时间超过d,则要付加班费d×r. 问如何分配路线才能使加班费最少. 分析: 感觉上是要先排序,然后时间最长的路线配另一个时间最短的路线. 这里就严格证明一下这样贪心的正确性. 以两条路线为例,其他情况都是类似的: 不妨假设:A1≥A2,B1≤B2,水平线代表d 情况一: 如图,司机一要付加班费,司机二不用,如果我们将B1.B2交换: 因为B1≤B2,所以付给司机一的加班费不会

UVa 1467 (贪心+暴力) Installations

题意: 一共有n项服务,每项服务有安装的时间s和截止时间d.对于每项任务,如果有一项超出截止时间,惩罚值为所超出时间的长度.问如何安装才能使惩罚值最大的两个任务的惩罚值之和最小. 分析: 如果是求总惩罚值的最小值,则按所有任务的截止时间排序,这样贪心的理由是,先完成截止时间早的任务至少不会是情况变得更坏. 虽然题目所求不是这个,但我们可以稍作修改. 设p为按上述贪心顺序安装任务,惩罚值最大的两个任务中靠后的那个位置. 枚举p之前的任务i,将第i个任务移到p后面执行,有可能减小两个最大惩罚值之和,

uva 10026 贪心

https://vjudge.net/problem/UVA-10026 对于两个二元组(Ti,Si),(Tj,Sj), 当先执行i时耗费的价值是Ti*Sj,反之则是Tj*Si, 显然如果想要第一种情况更优得话,要满足Ti*Sj<Tj*Si, 按照这个直接排序就好了,因为要求字典序最小所以当二者等价时序号小的优先. 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node{int t,s,id;}P[1005]; 4 b

UVA 10718 Bit Mask

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define sc3(x,y,z) scanf("%lld%lld%lld", &x, &y, &z) 6 #define pf(x) printf("%lld\n",x) 7 #define FOR(i,b,e) fo

·UVa」 11292 - Dragon of Loowater( 贪心 )

Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance turned into a major problem. The shores of Rellau Creek in central Loowater had always been a prime breeding ground for geese. Due to the lack of predato

优质题表(机密版)

转载请注明出处:http://www.cnblogs.com/dashuzhilin/p/4556803.html 思维题: poj 1528 poj 1597 poj 2538 poj 2608 poj 2612 poj 2361 poj 2339 poj 2664 uva 10894 uva 10921   uva 10922   uva 10929 uva 10931   uva 10800   uva 10878 uva 10976   uva 10323   uva 201 poj 2

uva 10382 Watering Grass(贪心)

uva 10382 Watering Grass n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each sprinkler is installed at the horizontal center line of the strip. For each sprinkler we are given its position as the distance f