Codeforces Round#324 div.2 E
来源:互联网 发布:三菱伺服电机调试软件 编辑:程序博客网 时间:2024/06/06 02:20
题意:
给你两串数字序列,要求你按照把上面的一串变成下面的一串。转换需要的花费是sigma|i-j|,然后还需要要求你把转化的序列的次数打印出来,并且也要把每次转换对应的点打印出来。
思路:
先记录第一个序列每个元素在第二个应该有的位置需要的花费,即计算每一个|i-j|,对于这个序列需要的花费,即是sigma|i-j|,现在我们做一个操作,对于那些要往后移动的,我们将它的移动花费变成正数,需要往前移动的我们将它的移动变成负数。(这个序列转化成下一个序列需要的花费是之前计算的花费之和的二分之一),为什么是花费之和是二分之一呢。因为对于任意一个pi要移动到pj都是要花费|i-j|的代价的,而pj因为被移动了所以会产生额外的|i-j|的花费,这就是最后需要乘上二分之一的原因。
移动的策略是,从左往右找到第一个小于0的数(这个代表着要向前移动的数),然后从这个点开始找到第一个正数,然后两个数交换,并且这个交换一定是属于因该有交换序列。为什么这个是能得到的正确的移动序列呢?因为这时候的移动保证了一定是整体的移动花费减少的操作。不断寻找,直到所有的数都变成0结束退出。
#include<iostream>#include<string>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define maxn 2005int m[maxn], n[maxn];int a[maxn*1000], b[maxn*1000];int x;int c = 0;int main(){ int N; cin >> N; for (int i = 1; i <= N; i++) { cin >> m[i];; } for (int i = 1; i <= N; i++) { cin >> n[i]; } int sum = 0; for (int i = 1; i <= N; i++) { for (int j = 1; i <= N; j++) { if (m[i] == n[j]) { m[i] = j - i; sum += abs(j-i); break; } } } printf("%d\n", sum / 2); bool flag = true; int i, j; sum /= 2; while (sum) { i = 1, j = 1; for (i = 1; i <= N; i++) { if (m[i] < 0) break; } for (j = i-1; j > 0; j--) { if (m[j]) break; } int temp = m[i]; a[c] = i; b[c++] = j; m[i] = m[j] - abs(j - i); m[j] = temp + abs(j - i); sum -= abs(j - i); } printf("%d\n", c); for (int i = 0; i < c; i++) printf("%d %d\n",a[i],b[i]); return 0;}
0 0
- Codeforces Round#324 div.2 E
- [排列组合]Codeforces Round #324 (Div. 2)E - Anton and Ira
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces Round #103 (Div. 2) E题
- Codeforces Round #147 (Div. 2) E
- Codeforces Round #184 (Div. 2) D、E
- Codeforces Round #197 (Div. 2) (C~E)
- Codeforces Round #102 (Div. 2) //缺E
- Codeforces Round #104 (Div. 2) //缺E
- Codeforces Round #105 (Div. 2) //缺E
- Codeforces Round #103 (Div. 2) //缺E
- Codeforces Round #106 (Div. 2) //缺E
- Codeforces Round #223 (Div. 2) E
- Codeforces Round #229 (Div. 2) E
- Codeforces Round #139 (Div. 2) E. Unsolvable
- Codeforces Round #142 (Div. 2) E. Triangles
- Codeforces Round #256 (Div. 2) E. Divisors
- Codeforces Round #260 (Div. 2) E
- RAII惯用法:C++资源管理的利器 http://www.cnblogs.com/hsinwang/articles/214663.html
- 连接池配置(server.xml)后报Invalid byte 1 of 1-byte UTF-8 sequence
- C语言基础 - extern,移位与或非
- 客户端向服务端发送信息
- Qt学习之路_9(Qt中Item Widget初步探索)
- Codeforces Round#324 div.2 E
- C++之RAII惯用法 blog.csdn.net/hunter8777/article/details/6327704
- UITableViewCell的背景设置
- QTableView的表格项中加入图标的方法
- Struts实战-使用SSH框架技术开发学籍管理系统
- 关于拉格朗日乘子法与KKT条件
- 为什么c++抛出异常后还能对函数内的局部对象进行析构? http://segmentfault.com/q/1010000002498987
- DDoS deflate – Linux下防御/减轻DDOS攻击
- 加盐hash保存密码的正确方式(上)