NYOJ 1057 寻找最大数(三)(关于贪心算法的认识)

以前做贪心题目都第一步对数据进行从大到小的排序,大部分贪心题目的的处理方法也是这样。但是NYOJ的1057题,在解题中

并不需要排序,一时间都没有意识到是贪心题。在看了讨论区之后意识到要用贪心的思想,才解出题目。认识到贪心算法并非是排序后再处理的机械操作,而是从局部寻求最优解的思想。

原题如下:

寻找最大数(三)

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描述

给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。

求这个新的整数的最大值是多少。

输入
多组测试数据。

每组测试数据占一行,每行有两个数N和K (1?≤?N≤?10^18; 0?≤?K?≤?100).

输出
每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
样例输入
1990 1
100 0
9090000078001234 6
样例输出
9190
100
9907000008001234
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	int n,t,i,k,len;
	char max,str[100];
	while(scanf("%s%d",str,&k)!=EOF)
	{
		len=strlen(str);
		t=0;//t标记每次交换开始的首位置
		while(k>0)
		{
			if(t==len)
			  break;
			n=t;//用n标记每次交换开始时的用于交换部分的首字符
			for(i=t;i<=t+k;i++)
			{
				if(i>=len)
				  break;
				if(str[i]>str[n])
				  n=i;//遇到字符数大的字符时,用n标记下来。
			}
			if(n!=t)
			{
				max=str[n];
				for(i=n;i>t;i--)
				  str[i]=str[i-1];
				str[t]=max;
				k-=n-t;//等于k=k-(n-t);
			}
			t++;
		}
		printf("%s\n",str);
	}
	return 0;
}
时间: 2024-10-10 02:49:05

NYOJ 1057 寻找最大数(三)(关于贪心算法的认识)的相关文章

NYOJ 1057 寻找最大数(三) (贪心)

题目描述 http://acm.nyist.net/JudgeOnline/problem.php?pid=1057 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的最大值是多少. 输入 多组测试数据. 每组测试数据占一行,每行有两个数N和K (1?≤?N≤?10^18; 0?≤?K?≤?100). 输出 每组测试数据的输出占一行,输出移动后得到的新的整数的最大值. 样例输入 1990 1 100 0 9090000078001234 6 样例

nyoj 1057寻找最大数(三) 贪心

#include <stdio.h> #include <string.h> int main(){ char temp,str[20]; int k,len,mark,flag,j; while(scanf("%s %d",str,&k)!=EOF){ len=strlen(str); if(k==0) { puts(str); continue; } for(int i=0;i<len;i++){ temp=str[i],flag=1; for

Num 27 : NYOJ : 0448 寻找最大数 [ 贪心 ]

一道经典的贪心问题:如题: 寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次

NYOJ 448 寻找最大数【贪心】

寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数 样例输入

算法设计与分析(三)贪心算法--活动安排问题

活动安排问题https://blog.csdn.net/qq_40452317/article/details/88875384 贪心算法汇总--喷水装置问题.会场安排问题.过河问题https://blog.csdn.net/liujiuxiaoshitou/article/details/69728714 原文地址:https://www.cnblogs.com/yasheng/p/12517250.html

NYOJ 14 会场安排问题(贪心算法)

时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动.现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排. 输入 第一行是一个整型数m(m<100)表示共有m组测试数据.每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动.随后的n行,每行有两个正整数Bi

贪心算法

一,贪心算法的设计思想 ? 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止. 二,贪心算法的基本性质 1)贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.这是贪心算法可行的第一个基本要素,也是贪心法与动态规划法的主要区别. 2) 最优子结构性质 该问题解的整体最优性依赖于其局部子问题解的最优性.这种性质是可以采用贪心算法解决问题的关键特征.例如

分治法、动态规划、回溯法、分支界限法、贪心算法

转:http://blog.csdn.net/lcj_cjfykx/article/details/41691787 分治算法一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时

贪心算法入门

今天看了一下贪心算法,贪心算法没有具体的算法框架.贪心算法主要找当前看来最好的解,没有考虑整体最优.得到的只是局部最优解. 贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 二.贪心算法的基本思路: 1.建立数学模型来描述问题. 2.把求解的问题分成若干个子问题. 3.对每一子问题求解,得到子问题的局部最优解. 4.把子问题的解局部最优解合成原来解问题的一