PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法
贪心算法
次数最少的方法,即:
1.每次都将0与应该放置在0位置的数字交换即可。
2.如果0处在自己位置上,那么随便与一个不处在自己位置上的数交换,重复上一步即可。
拿样例举例:
0 1 2 3 4 5 6 7 8 9
0:3 5 7 2 6 4 9 0 8 1
1:3 5 0 2 6 4 9 7 8 1
2:3 5 2 0 6 4 9 7 8 1
3:0 5 2 3 6 4 9 7 8 1 (如果0处在自己位置上,那么找一个不在自己位置上的数val与之交换)
4:5 0 2 3 6 4 9 7 8 1
5:5 1 2 3 6 4 9 7 8 0
6:5 1 2 3 6 4 0 7 8 9
7:5 1 2 3 0 4 6 7 8 9
8:5 1 2 3 4 0 6 7 8 9
9:0 1 2 3 4 5 6 7 8 9
在例子第3步交换中,如果每次都线性查找,时间复杂度就会很高,会有2组样例超时。
这里用set优化了下速度。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
#include <set>
using namespace std;
const int maxn=+;
int a[maxn];
int pos[maxn];
int cnt;
set<int> leftnum; //存储了还没有被放到正确位置上的数字(0除外)
int main()
{
int n;
scanf("%d",&n);
cnt=n; //还未排好序的个数
for(int i=;i<n;i++){
scanf("%d",&a[i]);
pos[a[i]]=i;
if(i==a[i])
cnt--;
else if(a[i]!=)
leftnum.insert(a[i]);
}
int p0=pos[]; //0目前所在的位置
int p;
int ans=;
while(cnt){
//将0和应处在0位置的数(p0)交换位置
a[p0]=p0;
leftnum.erase(p0);
p0=pos[p0];
a[p0]=;
ans++;
cnt--;
if(p0==)
cnt--;
//如果0在自己位置上,但还没有排好序
if(p0== && cnt){
//这里用set来优化寻找还没有处在自己位置上的数字,将0与之交换
int val=*leftnum.begin();
int tmp=pos[val];
pos[val]=p0;
a[p0]=val;
p0=tmp;
a[p0]=;
ans++;
cnt++;
}
}
printf("%d",ans);
return ;
}
PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法的更多相关文章
- PAT Advanced 1067 Sort with Swap(0,*) (25) [贪⼼算法]
题目 Given any permutation of the numbers {0, 1, 2,-, N-1}, it is easy to sort them in increasing orde ...
- 1067. Sort with Swap(0,*) (25)【贪心】——PAT (Advanced Level) Practise
题目信息 1067. Sort with Swap(0,*) (25) 时间限制150 ms 内存限制65536 kB 代码长度限制16000 B Given any permutation of t ...
- PTA 1067 Sort with Swap(0, i) (贪心)
题目链接:1067 Sort with Swap(0, i) (25 分) 题意 给定长度为 \(n\) 的排列,如果每次只能把某个数和第 \(0\) 个数交换,那么要使排列是升序的最少需要交换几次. ...
- 1067. Sort with Swap(0,*) (25)
时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given any permutation of the num ...
- PAT (Advanced Level) 1067. Sort with Swap(0,*) (25)
只对没有归位的数进行交换. 分两种情况: 如果0在最前面,那么随便拿一个没有归位的数和0交换位置. 如果0不在最前面,那么必然可以归位一个数字,将那个数字归位. 这样模拟一下即可. #include& ...
- PAT甲题题解-1039. Course List for Student (25)-建立映射+vector
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789157.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT甲题题解-1055. The World's Richest (25)-终于遇见一个排序的不水题
题目简单,但解题的思路需要转换一下,按常规思路肯定超时,推荐~ 题意:给出n个人的姓名.年龄和拥有的钱,然后进行k次查询,输出年龄在[amin,amx]内的前m个最富有的人的信息.如果财富值相同就就先 ...
- PAT甲题题解-1002. A+B for Polynomials (25)-多项式相加
注意两点:1.系数也有可能加起来为负!!!一开始我if里面判断为>0导致有样例没过...2.如果最后所有指数的系数都为0,输出一个0即可,原本以为是输出 1 0 0.0... #include ...
- PAT甲题题解-1102. Invert a Binary Tree (25)-(建树,水题)
就是把输入给的左孩子右孩子互换一下,然后输出层次遍历和中序遍历. #include <iostream> #include <algorithm> #include <c ...
随机推荐
- 用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)-陈远波
一.通过点击按钮事件,实现四大界面之间的跳转: (一)跳转的思路: 1.打开软件,只显示登录界面(隐藏游戏界面.暂停界面.玩家死亡界面) 2.点击微信登录(QQ登录)跳转到游戏界面,隐藏登录界面 3. ...
- leetcode 121 买卖股票的最佳时机
题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. ...
- 【项目 · Wonderland】UML设计
团队作业---UML设计 Part 0 · 简要目录 Part 1 · 团队分工 Part 2 · UML Part 3 · 工具选择 Part 1 · 团队分工 Part 2 · UML 描述信息: ...
- sublime text3 setting-user
{ "caret_style": "smooth", "find_selected_text": true, "font_size ...
- 【转】PHP中file_put_contents追加和换行
在PHP的一些应用中需要写日志或者记录一些信息,这样的话. 可以使用fopen(),fwrite()以及 fclose()这些进行操作. 也可以简单的使用file_get_contents()和fil ...
- JMX RMI 攻击利用
攻击者通过构造恶意的MBean,调用 getMBeansFromURL 从远程服务器获取 MBean,通过MLet标签提供恶意的MBean对象下载. 前提条件: 允许远程访问,没有开启认证 (com. ...
- hadoop学习通过虚拟机安装hadoop完全分布式集群
要想深入的学习hadoop数据分析技术,首要的任务是必须要将hadoop集群环境搭建起来,可以将hadoop简化地想象成一个小软件,通过在各个物理节点上安装这个小软件,然后将其运行起来,就是一个had ...
- 网络嗅探与欺骗(FTP部分)——P201421410029
第三部分 FTP协议分析 1. 两个同学一组,A和B. 2.A同学架设FTP服务器,并设置用户名和密码,例如wbx /wbx 3.B同学在机器中安装Wireshark,并将其打开:之后用用户名和密码登 ...
- leetcode-876 Middle of the Linked List
Given a non-empty, singly linked list with head node head, return a middle node of linked list. If t ...
- abp 将abp项目发布之后挂在IIS上无法访问嵌入资源的问题
在本地调试是能够正常访问到写在另一个程序集中的嵌入资源,但是发布之后 挂在IIS上却不能访问. 整了半天没找到原因.后来发现是发布时配置错误造成的:取消勾选precompile during publ ...