博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ3629 2436(CUHK summer training on 28 JUN 2012)(队列、二进制)
阅读量:5836 次
发布时间:2019-06-18

本文共 1405 字,大约阅读时间需要 4 分钟。

AB水过。

C:POJ3629 打牌模拟题。K张牌中有N张好牌,每次发牌前将前P张放在最底,如何安排牌的位置使每次某人拿到的牌都是好牌。

  用数组自编一个queue可以AC,然而使用C++ vector 或者 queue 都会造成TLE。可见用数组模拟速度快不少。

 

D:POJ2436 有N头牛,有D种疾病,每头牛都含某几种、或者不含病。现将这些牛的牛奶混合在一起,且牛奶中的病毒种类不超过K种,问最多    能取几头牛的牛奶?

  思路:将每头牛的含病情况用二进制表示,例如若有三种病,且含第一二种病,则用110表示,若是含第二种病,则用010表示。然后用另一个二进制数表示K种病毒,用next_permutation()函数生成所有排列,每种排列都对每头牛用或(|)操作。最后取出最大的即可。

 

附D代码:

#include
#include
#include
using namespace std;int cows[1000];int cvt(string a){ int b = 0; for(int j = 14; j >= 0; j--) if(a[j] == '1') b = b * 2 + 1; else b *= 2; return b;}int main(){ int N, D, K; cin >> N >> D >> K; for(int i = 0; i < N; i++){ int num; cin >> num; string temp(15, '0'); while(num--){ int x; cin >> x; temp[x - 1] = '1'; } cows[i] = cvt(temp); }// for(int i = 0; i < N;i++)// cout << cows[i] <<" "; string t1(K, '1'); string t2(15 - K, '0'); string pot = t2 + t1; int max = 0; do{ int tpl = cvt(pot); int ans = 0; for(int i = 0; i < N; i++) if(tpl == (tpl | cows[i])) ans++; if(max < ans) max = ans; }while(next_permutation(pot.begin(), pot.end())); cout << max << endl;}

转载于:https://www.cnblogs.com/dogspeek/archive/2012/06/29/2570539.html

你可能感兴趣的文章
那些我们明白却不能完美的
查看>>
Linux Oracle启动SqlPlus无法连接
查看>>
Android中自定义checkbox样式
查看>>
新浪微博模拟登录–HTTPS方式
查看>>
Linux NFS配置小结
查看>>
当用户有登录到的限制时,远程桌面登录报错的解决
查看>>
Java--jvm性能优化课程之基本类型
查看>>
angular的canvas画图例子
查看>>
SELinux
查看>>
我的友情链接
查看>>
从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。...
查看>>
part 1--入门:
查看>>
Android APK应用安装原理(1)-解析AndroidManifest原理-PackageParser.parserPackage
查看>>
Spark 简介
查看>>
windows 7 下的 XP mode
查看>>
接口规范 13. 文件上传及管理相关接口
查看>>
类与封装的概念(十二)
查看>>
linux服务器crontab定时任务
查看>>
我非软件NSIS
查看>>
Windows server 2012安装.NET 3.5
查看>>