Codeforces,578C,贪心出错,手工模拟“或”操作
2015-09-17 13:03
323 查看
题意:
给出n个数,k次操作,每次操作可以将任一数乘以x,问k次操作后,这n个数的“取或”的值,最大为多少。
分析:
肯定是找二进制表示下,最长的那个数,进行所有的k次操作,我的错误解法,找了值最大的那个数进行k次操作,反例:3(11),2(10),若操作一次的话,应该操作10,而不是11。
正确做法,枚举操作哪个数,然后将k次操作都加到他身上,通过num[]数组记录“取或”操作后,每一位是1的个数,然后可以方便取消对某个数的或操作,以及恢复对某个数的或操作。
具体代码:
给出n个数,k次操作,每次操作可以将任一数乘以x,问k次操作后,这n个数的“取或”的值,最大为多少。
分析:
肯定是找二进制表示下,最长的那个数,进行所有的k次操作,我的错误解法,找了值最大的那个数进行k次操作,反例:3(11),2(10),若操作一次的话,应该操作10,而不是11。
正确做法,枚举操作哪个数,然后将k次操作都加到他身上,通过num[]数组记录“取或”操作后,每一位是1的个数,然后可以方便取消对某个数的或操作,以及恢复对某个数的或操作。
具体代码:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #include<cmath> #include<set> using namespace std; #define N 200010 typedef long long LL; #define aa frist #define bb second int n,k; LL ans,x,sum; LL a ,num[70]; //multiset<LL> st; void up_or(LL now) { int j=0; sum|=now; while(now!=0) { num[j++]+=now&1; now>>=1; } } void down_or(LL now) { int j=0; while(now!=0) { num[j++]-=now&1; now>>=1; } sum=0; for(j=65;j>=0;j--) { if(num[j]>0) sum=2*sum+1; else sum=2*sum; } } int main() { while(scanf("%d%d%I64d",&n,&k,&x)!=EOF) { ans=0; sum=0; memset(num,0,sizeof(num)); for(int i=0; i<n; i++) { scanf("%I64d",&a[i]); up_or(a[i]); } LL now; for(int i=0;i<n;i++) { LL v=a[i]; down_or(v); for(int j=0; j<k; j++) v*=x; now=sum|v; ans=max(now,ans); up_or(a[i]); } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- java SE复习笔记19
- 如何区分MNO和MVNO
- prototype.js的使用: 中文参数出现乱码
- 检测远程URL是否存在的三种方法
- 用 Win2003 架设邮件服务器
- 24个常用方法有效优化ASP.NET的性能(四)
- 24个常用方法有效优化ASP.NET的性能(三)
- js幻灯片播放器
- 简单实现中文分词中的常用字过滤
- 24个常用方法有效优化ASP.NET的性能(二)
- 24个常用方法有效优化ASP.NET的性能(一)
- 捕获asp.net下的未处理异常
- 后台程序弹出对话框(Reponse.Write)后css失效的解决方法
- 简单解决AJAX在IE中的缓存问题
- "用户 'NT AUTHORITY/NETWORK SERVICE' 登录失败。"的解决方法.
- 如何做好大型数据中心的运维
- Apache2.4和Tomcat7.0安装整合
- Tcp协议的三次握手
- Xcode7 网络请求报错:The resource could not be loaded because the App Transport Security policy requir
- systemtap 2.8 news