SGU 205. Quantization Problem
205. Quantization Problem
time limit per test: 0.25 sec.
memory limit per test: 65536 KB
input: standard
output: standard
When entering some analog data into a computer, this information must be quantized. Quantization transforms each measured value x to some other value l(x) selected from the predefined set L of levels. Sometimes to reduce the influence of the levels set to the information, the group of levels sets Li is used. The number of levels sets is usually chosen to be the power of 2.
When using the number of levels sets, some additional information should be used to specify which set was used for each quantization. However, providing this information may be too expensive — the better solution would be to choose more levels and use one set. To avoid the specification of the quantization set, the following technique is used. Suppose that n values \(x_1, x_2, ..., x_n\) are to be quantized and the group of \(m=2^p\) levels sets \(Li, i=0, ..., m-1\); each of size \(s=2^q\) is used to quantize it. After quantization \(x_j\) is replaced with some number \(l_j = in L_{f(j)}\). Instead of sending \(l_j\), its ordinal number in \(L_{f(j)}\) is usually sent, let \(k_j\) be the ordinal number of \(l_j\) in \(L_{f(j)}\) (levels are numbered starting with 0). Take p least significant bits of \(k_j\) and say that the number \(k_j\ \&\ (2^p-1)\) is the number of the levels set that will be used for next quantization, that is \(f(j+1) = k_j\ \&\ (2^p-1)\).
Since the least significant bits of kj are usually distributed quite randomly, the sets used for quantization change often and weakly depend on values of quantized data, thus this technique provides the good way to perform the quantization.
Usually to perform the quantization the closest to the value level of the levels set is chosen. However, using the technique described, sometimes it pays off to choose not the optimal level, but some other one, the ordinal number of which has other least significant bits, thus choosing another levels set for next measure and providing better approximation of quantized values in the future. Let us call the deviation of quantization the value of \(\sum_{j=1}^{n}|xj - lj|\). Your task is given measures and levels sets to choose quantized value for each measure in such a way, that the deviation of quantization is minimal possible.
The first value is always quantized using set L0.
Input
The first line of the input file contains n (1 ≤ n ≤ 1000). The second line contains n integer numbers xi ranging from 1 to 106. The next line contains m and s \((1 ≤ m ≤ 128, m ≤ s ≤ 128)\). Next m lines contain s integer numbers each — levels of the quantization sets given in increasing order for each set, all levels satisfy \(1 ≤ level ≤ 10^6\).
Output
First output the minimal possible deviation of the quantization. Then output n integer numbers in range from 0 to s - 1. For each input value output the number of the level in the corresponding levels set \((k_j)\) used for this number to achieve the quantization required.
Sample test(s)
Input
3
8 8 19
2 4
5 10 15 20
3 7 13 17
Output
5
1 1 3
题意
给出一列长n的数列\(\{S_i\}\)和一个\(m\times s\)的矩阵\(A\)(\(m\le s\)且\(m,s\)都是2的整数次方)。求一列数\(\{K_i\}\),使\(K_0=0\),且 \(\sum_{i=1}^{n}{|A_{K_{i-1} \mod m, K_i}-S_i|}\)最小。
引用与修改自Amber——SGU 提示
看懂题了就是sb题了。
由于在阶段i时对答案产生影响的只有\(K_i\)和\(K_{i-1}\)的取值,显然可以DP做。不妨用f[i][j]表示考虑到第i个数字\(K_i\)取j时的最小值,转移是显然的:f[i][j]=min(f[i-1][k]+A[k%m][j]-S[i]),注意记录路径,然后没了。。就是题意难懂啊。
#include <bits/stdc++.h>
#define rep(_i, _j) for(int _i = 0; _i < _j; ++_i)
const int inf = 0x3f3f3f3f;
typedef long long LL;
typedef double DB;
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1000 + 10;
const int maxm = 128 + 2;
int n, m, s, A[maxm][maxm], f[maxn][maxm], pre[maxn][maxm], S[maxn];
int main() {
#ifndef ONLINE_JUDGE
freopen("205.in", "r", stdin); freopen("205.out", "w", stdout);
#endif
scanf("%d", &n);
for(int i = 1; i <= n; scanf("%d", &S[i]), ++i); // 大家不要学我这样写。。。
scanf("%d%d", &m, &s);
rep(i, m) rep(j, s) scanf("%d", &A[i][j]);
memset(f, INF, sizeof f);
f[0][0] = 0;
for(int i = 1; i <= n; ++i) {
for(int j = 0; j < s; ++j) {
if(i == 1) {
f[i][j] = min(f[i][j], f[i - 1][0] + abs(A[0][j] - S[i]));
pre[i][j] = 0;
continue;
}
for(int k = 0; k < s; ++k) {
int tmp = f[i - 1][k] + abs(A[k % m][j] - S[i]);
if(tmp < f[i][j]) {
pre[i][j] = k;
f[i][j] = tmp;
}
}
}
}
int ans = INF, rec;
for(int i = 0; i < s; ++i) {
if(f[n][i] < ans) {
ans = f[n][i];
rec = i;
}
}
printf("%d\n", ans);
vector<int> res;
int i = n;
while(i != 0) {
res.push_back(rec);
rec = pre[i--][rec];
}
printf("%d", res[res.size() - 1]);
for(int i = res.size() - 2; 0 <= i; --i) {
printf(" %d", res[i]);
}
puts("");
return 0;
}
SGU 205. Quantization Problem的更多相关文章
- 找规律 SGU 107 987654321 problem
题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=107 /* 题意:n位数的平方的后面几位为987654321的个数 尼玛,我看描述这 ...
- acdream 1222 Quantization Problem [dp]
称号:acdream 1222 Quantization Problem 题意:给出一个序列 a ,然后给出一个 n * m 的矩阵,让你从这个矩阵中选出一个序列k,使得sum(abs(ki - ai ...
- SGU 107 987654321 problem【找规律】
题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=107 题意: 平方后几位为987654321的n位数有多少个 分析: 虽然说是水题 ...
- SGU 403 Scientific Problem
403. Scientific Problem Time limit per test: 0.25 second(s)Memory limit: 65536 kilobytes input: stan ...
- 数论 - SGU 107 987654321 problem
987654321 problem Problem's Link Mean: 略 analyse: 这道题目是道简单题. 不过的确要好好想一下: 通过简单的搜索可以知道,在N<9时答案一定为0, ...
- SGU - 403 - Scientific Problem (水)
403. Scientific Problem Time limit per test: 0.25 second(s) Memory limit: 65536 kilobytes input: sta ...
- sgu 107 987654321 problem
其实挺水的,因为两个数平方,只有固定的后面几位数会影响到最后结果的后面几位数.也就是说,如果想在平方之后尾数为987654321,那么就有固定的几个尾数在平方后会是这个数,打个表,发现 10^8 内 ...
- 数论 - SGU 105 DIV3
SGU 105-DIV 3 Problem's Link Mean: 定义这样一种数列:1,12,123.. 给出一个n,求这个数列中能被3整除的数的个数. analyse: 这道题可以用分析的方法解 ...
- SGU 乱搞日志
SGU 100 A+B :太神不会 SGU 101 Domino: 题目大意:有N张骨牌,两张骨牌有两面有0到6的数字,能相连当且仅当前后数字相同,问能否有将N张骨牌连接的方案?思路:裸的欧拉回路,注 ...
随机推荐
- Linux之GDB调试介绍与应用20170601
一.GDB调试命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或i) ...
- C++ ------ 虚函数覆盖、重载
在C++语言中,虚函数是非常重要的概念,虚函数是实现C++面向对象中多态性和继承性的基石.而多态性和继承性则是面向对象语言的精髓.掌握虚函数才算是真正掌握C++语言,而C++语言中虚函数的继承覆盖与函 ...
- 分享 koa + mysql 的开发流程,构建 node server端,一次搭建个人博客
前言 由于一直在用 vue 写业务,为了熟悉下 react 开发模式,所以选择了 react.数据库一开始用的是 mongodb,后来换成 mysql 了,一套下来感觉 mysql 也挺好上手的.re ...
- java类的静态属性值获取
获取某个类实例的静态属性: public class ErrorCode { private String code; private String message; private ErrorCod ...
- HTML常用标签-手打抄录-来自-烟雨飘零-拜谢
HTML常用标签及其全称 <a href="#">a 超级链接(anchor)</a> <abbr title="abbreviati ...
- Linux系统调用和库函数
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unist ...
- 【BZOJ】2693: jzptab 莫比乌斯反演
[题意]2154: Crash的数字表格 莫比乌斯反演,多组询问,T<=10000. [算法]数论(莫比乌斯反演) [题解]由上一题, $ans=\sum_{g\leq min(n,m)}g\s ...
- 【LibreOJ】#6298. 「CodePlus 2018 3 月赛」华尔兹 BFS
[题意]给定n*m的网格,起点和终点位置,一些格指定下一步的方向,一些格任意.要求为方向任意的格确定方向,使起点可以走到终点.n,m<=50. [算法]BFS [题解]这道题最好用BFS,因为D ...
- Oracle数据库语句
Oracle数据库语句 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHEC ...
- antdVG6随记
g6是一个很棒的可视化工具 目前支持开发者搭建属于自己的图,图分析.图应用.图编辑器 图编辑器可以支持多种图例的创建 G6 是一个简单.易用.完备的图可视化引擎,它在高定制能力的基础上,提供了一系列设 ...