hdu 5500 Reorder the books
2015-10-11 15:35
155 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5500
给定一个从1到n的乱序序列,每次取一个数到最前面,问最少多少次能使序列变为增序。
初始以为是逆序数,后来知道不对,应该是贪心。
细想发现,加入操作了大小等于k的数,那么所有小于k的数也都得操作。首先最大的数n是不用操作的(其他数操作好了,n自然在最后面了)。先找到数n的位置,在n之前找n-1,若没找到n-1,则n-1需要操作,所有小于n-1的数均需要操作;若找到了n-1,再接着往前依次找n-2,n-3,。。。假如数k找不到了,那就是至少需要k次操作。
复杂度O(n)。
给定一个从1到n的乱序序列,每次取一个数到最前面,问最少多少次能使序列变为增序。
初始以为是逆序数,后来知道不对,应该是贪心。
细想发现,加入操作了大小等于k的数,那么所有小于k的数也都得操作。首先最大的数n是不用操作的(其他数操作好了,n自然在最后面了)。先找到数n的位置,在n之前找n-1,若没找到n-1,则n-1需要操作,所有小于n-1的数均需要操作;若找到了n-1,再接着往前依次找n-2,n-3,。。。假如数k找不到了,那就是至少需要k次操作。
复杂度O(n)。
#include<cstdio> #include<cstdlib> #include<vector> #include<cstring> #include<set> #include<queue> #include<stack> #include<map> #include<algorithm> #include<iostream> #include<ctime> #include<bitset> using namespace std; #define N 300005 #define NMAX 2000000000 typedef long long ll; int a[22]; bool cmp(const int& x, const int& y){ return x>y; } int main(){ int T, n, m; while ( scanf("%d", &T) != EOF){ while ( T > 0 ){ T--; scanf("%d", &n); int index = -1; for ( int i = 0 ;i < n; i++ ){ scanf("%d", &a[i]); } int ans = 0, t = n - 1, cur = n; while ( t >= 0 ){ if ( a[t] == cur ) cur--; t--; } cout << cur << endl; } } return 0; }
相关文章推荐
- LintCode : 搜索旋转排序数组
- UVa116
- SQL Server 2000 分页查询
- CloudStack 故障排查汇总-不定期更新
- iOS工程中的info.plist文件
- 字符串hash问题
- 单点更新区间求和 hdu1166 地兵布阵
- Instruments的使用
- 黑马程序员——面试题总结
- 编程图记(1): 引言
- 一元多项式的乘法与加法运算——链表实现
- 程序员书单_数据库篇
- 3、10月10日
- MySQL 5.6 innodb存储引擎参数
- 程序员书单_sshi框架篇
- 保存dotNetCharting for WinForm 控件的生成的图表
- 循环赛日程表
- Android学习第一天之LinearLayout浅析
- 异常处理 续之(堆栈解退、auto_ptr)http://blog.csdn.net/feitianxuxue/article/details/7314079
- 程序员书单_sshi框架篇