POJ1055 BULK MAILING
题目来源:http://poj.org/problem?id=1055
题目大意:
每封信都有一个zip-code, 由5位数字构成,可以通过将zip-code相同或相近的信件打包来节省成本。打包规则是:5位数字完全相同的10-15封可组成一个包(5-digit bundles),或者将前3位数字相同的信件打包,同样10-15份一包(3-digit bundles)。优先分配为5-digit bundles, 其次3-digit bundles。不能被打包的信件为first class letters。要求输出打包方案。
输入:没行一个zip-code,但并非每个都是合法的。合法的zip-code恰好由5位数字组成,不能全为0.
输出:按上述要求输出打包方案,格式见输出,合法的bundles和letters需要按数字大小顺序输出。。
Sample Input
95864
95864
95864
95867
95920
9j876
95616
95616
95747
95814
95818
95818
8976
95818
95818
95819
95819
00000
95819
95819
95819
95819
95819
95825
95825
95825
95825
95825
95826
95826
95826
95826
95826
95826
95827
8976
95833
95833
95833
95833
95819
95819
95819
95819
95833
95833
95833
95864
95864
95864
123456
95864
95864
95864
95864
Sample Output
ZIP LETTERS BUNDLES 95819 11 1
95864 10 1 958xx 25 2 95616 2 0
95747 1 0
95920 1 0 TOTALS 50 4 INVALID ZIP CODES 9j876
8976
00000
123456
本题虽在POJ的第一版,但是却人气颇低..确实不太有意思, 主要思想就是桶排序。
输出格式非常坑人,很容易错,题目描述得也不是特别清楚,最后的非法zip-code需要判重且按出现顺序输出。按照提述规则,似乎有可能出现多解的情况,但是测试数据没有太刁难,invalid zip-code的长度最长只到6,zip-code最高位不为0,用最简单的策略(对于一些比较偏的case可能不能过的)也可以AC。所以,这样的题随便看看就好了..
////////////////////////////////////////////////////////////////////
// POJ1055 BULK MAILING
// Memory: 1212K Time: 0MS
// Language: C++ Result : Accepted
/////////////////////////////////////////////////////////////////// #include <cstdio>
#include <string>
//#include <algorithm> using namespace std; struct Bundle {
int letter_cnt, bun_cnt;
}; Bundle buns[];
char buffer[], invalid_record[][];
int invalid_cnt, zip_cnt[], total_letters, total_buns; bool M[]; bool validity_check(char buffer[]){ //位数检查
if (strlen(buffer) != ) {
return false;
} //数字检查
for (int i = ; i < ; i++) {
if (buffer[i] < '' || buffer[i] > '') {
return false;
}
} //全0检查
bool flag = true;
for (int i = ; i < ; ++i) {
if (buffer[i] != '') {
flag = false;
break;
}
}
if (flag) {
return false;
}
return true;
} void process1(void) { //同5位10份以上打包
for (int i = ; i <= ; ++i) {
if (zip_cnt[i] >= ){
while (zip_cnt[i] >= ) {
buns[i].letter_cnt += ;
++buns[i].bun_cnt;
total_letters += ;
++total_buns;
zip_cnt[i] -= ;
}
if (zip_cnt[i] >= ) {
buns[i].letter_cnt += zip_cnt[i];
++buns[i].bun_cnt;
total_letters += zip_cnt[i];
++total_buns;
zip_cnt[i] = ;
}
}
} //按序输出
printf("ZIP LETTERS BUNDLES\n");
puts("");
for (int i = ; i <= ; ++i) {
if (buns[i].letter_cnt != ) {
printf("%d%12d%12d\n", i, buns[i].letter_cnt, buns[i].bun_cnt);
}
}
puts(""); //清空三位数的桶
for (int i = ; i <= ; ++i) {
buns[i].letter_cnt = buns[i].bun_cnt = ;
}
} void process2(void) { //同3位10份以上打包
for (int i = ; i <= ; ++i) {
int temp[][];
int cnt = , letter_cnt = ;
for (int j = ; j <= ; ++j) {
int num = i * + j;
if (zip_cnt[num] > ) {
temp[cnt][] = num;
temp[cnt][] = zip_cnt[num];
letter_cnt += zip_cnt[num];
zip_cnt[num] = ;
++cnt;
}
}
while (letter_cnt >= ) {
++buns[i].bun_cnt;
++total_buns;
buns[i].letter_cnt += ;
total_letters += ;
letter_cnt -= ;
}
if (letter_cnt >= ) {
++buns[i].bun_cnt;
++total_buns;
buns[i].letter_cnt += letter_cnt;
total_letters += letter_cnt;
letter_cnt = ;
}
while (letter_cnt > ) {
if (temp[cnt - ][] >= letter_cnt) {
zip_cnt[temp[cnt - ][]] += letter_cnt;
break;
} else {
zip_cnt[temp[cnt - ][]] += temp[cnt - ][];
letter_cnt -= temp[cnt - ][];
--cnt;
}
}
if (buns[i].letter_cnt > ) {
printf("%dxx%12d%12d\n", i, buns[i].letter_cnt, buns[i].bun_cnt);
}
}
puts("");
} void process3(void) {
//first class 输出
for (int i = ; i <= ; ++i) {
if (zip_cnt[i] > ){
printf("%d%12d%12d\n", i, zip_cnt[i], );
total_letters += zip_cnt[i];
}
}
puts("");
} void output_invalid(void) {
//非法zip-code输出
printf("INVALID ZIP CODES\n\n");
for (int i = ; i < invalid_cnt; ++i) {
bool flag = true;
for (int j = ; j < i; ++j) {
if (strcmp(invalid_record[i], invalid_record[j]) == ) {
flag = false;
}
}
if (flag) {
printf("%s\n", invalid_record[i]);
}
} }
int main(void) {
invalid_cnt = ;
while (scanf("%s", buffer) != EOF) {
if (validity_check(buffer)) { //桶排序
int num = ;
for (int i = ; i < ; ++i) {
num = num * + buffer[i] - '';
}
++zip_cnt[num];
} else {
strcpy(invalid_record[invalid_cnt], buffer);
++invalid_cnt;
}
} process1();
process2();
process3();
printf("TOTALS%11d%12d\n\n", total_letters, total_buns);
output_invalid(); return ;
}
POJ1055 BULK MAILING的更多相关文章
- POJ题目排序的Java程序
POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...
- Bulk Insert:将文本数据(csv和txt)导入到数据库中
将文本数据导入到数据库中的方法有很多,将文本格式(csv和txt)导入到SQL Server中,bulk insert是最简单的实现方法 1,bulk insert命令,经过简化如下 BULK INS ...
- Elasticsearch —— bulk批量导入数据
在使用Elasticsearch的时候,一定会遇到这种场景--希望批量的导入数据,而不是一条一条的手动导入.那么此时,就一定会需要bulk命令! 更多内容参考我整理的Elk教程 bulk批量导入 批量 ...
- [Oracle] Bulk Insert Data
命名空间:Oracle.DataAccess.Client 组件:Oracle.DataAccess.dll(2.112.1.0) ODP.NET 版本:ODP.NET for .NET Framew ...
- Oracle forall bulk collect批量数据更新
对于数据量较大的插入操作可采用此种方法操作,注意: limit减少内存占用,如果数据量较大一次性全部加载到内存中,对PGA来说压力太大,可采用limit的方法一次加载一定数量的数据,建议值通常为100 ...
- BULK操作减少redo实验
建表: create table sm_histable ( sm_id ), sm_subid ), service_type ), orgton ), orgnpi ), destton ), d ...
- sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
- 笔记整理之 Bulk Insert
之前2篇日志整理了BCP大致的用法,这次整理一下它的兄弟 Bulk Insert 的写法以及和bcp那边的结合的用法. 首先,Bulk Insert 语句要在连接了Sql Server 服务器之后才执 ...
- bulk collect no_data_found exception
Bulk collect当没有数据抛出异常跟implicit cursor 处理不一样. 先看一下implicit cursor的处理吧: cl scr; DECLARE l_descr hardwa ...
随机推荐
- 问题:sqlserver有没有类似Oracle的LISTAGG;结果: 灵活运用 SQL SERVER FOR XML PATH
灵活运用 SQL SERVER FOR XML PATH FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前 ...
- 【知识碎片】SQL篇
43.group by多个字段 查询每个班级男女生各多少人 Select count(id),xingbie,banji from tablename group by xingbie,banji 4 ...
- Linux-CentOS 学习的坎坷路 (一) 网络配置篇
自己学习的地址:http://www.imooc.com/view/175 学到2.8章节,配置IP这一块,妈蛋,他直接跳过了,都不知道怎么配置,无奈,只能Search 先是找到配置IP的方法: ht ...
- xUtils 源码解析
1. 功能介绍 xUtils 一个 Android 公共库框架,主要包括四个部分:View,Db, Http, Bitmap 四个模块. View 模块主要的功能是通过注解绑定 UI,资源,事件. D ...
- 基于R语言的RRT算法效率统计
- 面试题: java面试经历 已看1 抢红包如何分配每个人抢到的钱 有用 难点的面试题
2018.03.09 深圳乐唯科技 我看了下感觉这公司貌似挺不错的,面试官人也挺好的,氛围应该很不错,可惜我实力不足,唉,接续努力,下面把面试中印象较深的三个问题写一下. 面试问题1:数据库删除重复数 ...
- p4570 [BJWC2011]元素
传送门 分析 对法力值从大到小排序然后对编号跑线性基即可 代码 #include<iostream> #include<cstdio> #include<cstring& ...
- Django rest-framework框架十大功能分析
rest-framework框架有哪些作用? 一共有十点. 路由 - 可以通过as_view传参数,根据请求方式不同执行相应的方法 - 可以在url中设置一个结尾,类似于: .json 视图 - 帮助 ...
- oracle-dmp文件导入导出过程命令
创建表空间 create tablespace coss datafile 'D:\soft\db\oracle\oradata\orcl\coss.dbf' size 1000m autoexten ...
- DotNetty 版 mqtt 开源客户端 (MqttFx)
一.DotNetty背景介绍 某天发现 dotnet 是个好东西,就找了个项目来练练手.于是有了本文的 Mqtt 客户端 (github: MqttFx ) DotNetty是微软的Azure ...