博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-1416 Shredding Company 枚举
阅读量:5846 次
发布时间:2019-06-18

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

给定两个数,这两个数的长度都不超过6位数,然后求后一个数被怎样的分割能使得其和值最接近前一个数,其实这个问题就相当于在后一个数中进行插板而已。通过状态压缩来枚举隔板即可。

代码如下:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int t, num, bit[10], idx;void Break() { idx = -1; while (num) { bit[++idx] = num % 10; num /= 10; } for (int i = 0, j = idx; i < j; ++i, --j) { swap(bit[i], bit[j]); }}int get(int a, int b) { int ret = 0; for (int i = a; i < b; ++i) { ret *= 10, ret += bit[i]; } return ret;}void Print(int state) { int last = 0; for (int i = 1; i <= idx+1; ++i) { if (state & (1 << i)) { printf(" %d", get(last, i)); last = i; } }}bool judge(int state, int &ret) { int last = 0; ret = 0; for (int i = 1; i <= idx+1; ++i) { if (state & (1 << i)) { ret += get(last, i); last = i; } } return ret <= t;} int main(){ int mask, Max, cnt, state; while (scanf("%d %d", &t, &num), t | num) { int i; if (t == num) { printf("%d %d\n", t, num); continue; } mask = cnt = 0; Max = 0; Break(); for (i = 1; i <= idx; ++i) { mask |= (1 << i); // 对掩码进行赋值 } for (i = 0; i <= mask; i+=2) { int t = i; t |= (1 << (idx+1)); int ret; if (judge(t, ret)) { if (Max < ret) { Max = ret; state = t; cnt = 1; } else if (Max == ret) ++cnt; } } if (Max == 0) puts("error"); else if (cnt != 1) puts("rejected"); else { printf("%d", Max); Print(state); puts(""); } } return 0;}

 

转载地址:http://ouwjx.baihongyu.com/

你可能感兴趣的文章
控制器 控制器view cell的关系
查看>>
Eclipse RCP 玩转 Spring
查看>>
我的友情链接
查看>>
Nginx的健康检查机制
查看>>
Nginx介绍及企业web服务软件选择
查看>>
计算机书籍备忘
查看>>
esxi虚拟机中系统克隆及迁移的方法
查看>>
Linux必学的62条命令 (4)
查看>>
App_Offline.htm 功能
查看>>
java之旅
查看>>
解决linux虚拟机不能上网的问题
查看>>
恢复Reflector反编译后资源文件的办法
查看>>
HandlerExceptionResolver异常解析器家族揭秘
查看>>
Red Hat Linux4.0下主DNS服务器的搭建
查看>>
https/443安装
查看>>
Web服务器压力测试工具http_load、webbench、ab、Siege使用教程
查看>>
我的友情链接
查看>>
RHEL6.3 源码安装Puppet
查看>>
我的友情链接
查看>>
mybatis 和 hibernate 区别?
查看>>