hdu1160,FatMouse's Speed

FatMouse‘s Speed

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 9199    Accepted Submission(s): 4076

Special Judge

Problem Description

FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are increasing,
but the speeds are decreasing.

Input

Input contains data for a bunch of mice, one mouse per line, terminated by end of file.

The data for a particular mouse will consist of a pair of integers: the first representing its size in grams and the second representing its speed in centimeters per second. Both integers are between 1 and 10000. The data in each test case will contain information
for at most 1000 mice.

Two mice may have the same weight, the same speed, or even the same weight and speed.

Output

Your program should output a sequence of lines of data; the first line should contain a number n; the remaining n lines should each contain a single positive integer (each one representing a mouse). If these n integers are m[1], m[2],...,
m[n] then it must be the case that

W[m[1]] < W[m[2]] < ... < W[m[n]]

and

S[m[1]] > S[m[2]] > ... > S[m[n]]

In order for the answer to be correct, n should be as large as possible.

All inequalities are strict: weights must be strictly increasing, and speeds must be strictly decreasing. There may be many correct outputs for a given input, your program only needs to find one.

Sample Input

6008 1300
6000 2100
500 2000
1000 4000
1100 3000
6000 2000
8000 1400
6000 1200
2000 1900

Sample Output

4
4
5
9
7

Source

Zhejiang University Training Contest 2001

Recommend

Ignatius

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class HDU1160_ieayoio {
	public static F[] f;
	public static Mouse[] a;

	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		a = new Mouse[1010];
		int k = 0;
		while (cin.hasNext()) {
			// for (int i=1;i<=9;i++){
			k++;//老鼠数
			a[k] = new Mouse(cin.nextInt(), cin.nextInt(), k);
		}
		//先将老鼠按重量从小到大排序,只要对排序后的老鼠对其速度用动态规划找到最长下降子序列就好了
		Arrays.sort(a, 1, k + 1, new cmp());
		a[0] = new Mouse(0, Integer.MAX_VALUE, 0);
		f = new F[k + 5];
		for (int i = 0; i < f.length; i++) {
			f[i] = new F(0, 0);
		}

		for (int i = 1; i <= k; i++)
			for (int j = 0; j <= i - 1; j++) {
				//a[i].size != a[j].size保证重量不等
				//若速度满足下降
				if (a[i].size != a[j].size && a[i].speed < a[j].speed) {
					if (f[j].max + 1 > f[i].max) {
						f[i].max = f[j].max + 1;//找到比f[i]更优的
						f[i].last = j;//记录上一个的编号
					}
				}
			}
		int maxi = 0, max = Integer.MIN_VALUE;
		for (int i = 1; i <= k; i++) {
			if (max < f[i].max) {
				max = f[i].max;//找到最长下降的位置
				maxi = i;//并记录编号
			}
		}
		System.out.println(f[maxi].max);
		ptf(maxi);//寻找并输出方案

	}

	static void ptf(int k) {
		if (k == 0)
			return;
		ptf(f[k].last);//递归找起始的老鼠
		System.out.println(a[k].index);//输出当前老鼠原本的标号
	}

}

class cmp implements Comparator<Mouse> {

	@Override
	public int compare(Mouse o1, Mouse o2) {
		if (o1.size != o2.size) {
			return o1.size - o2.size;
		} else {
			return o2.speed - o1.speed;
		}
	}

}

class F {
	int max;//前i个老鼠的速度最长下降老鼠数
	int last;//上一个老鼠的编号

	F(int max, int last) {
		this.max = max;
		this.last = last;
	}
}

class Mouse {
	int size;//老鼠的重量
	int speed;//老鼠的速度
	int index;//老鼠原本的标号

	Mouse(int size, int speed, int index) {
		this.size = size;
		this.speed = speed;
		this.index = index;
	}
}

题目大意:

输入每行两个数,表示老鼠的重量和速度,需要找出所有老鼠中满足体重上升,速度下降的最长序列,输出最长序列数,并依次输出老鼠的标号

先将老鼠按重量从小到大排序,只要对排序后的老鼠对其速度用动态规划找到最长下降子序列就好了

hdu1160,FatMouse's Speed,布布扣,bubuko.com

hdu1160,FatMouse's Speed

时间: 2024-10-20 12:04:17

hdu1160,FatMouse's Speed的相关文章

HDU1160:FatMouse&#39;s Speed(最长上升子序列,不错的题)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1160 学的东西还是不深入啊,明明会最长上升子序列,可是还是没有A出这题,反而做的一点思路没有,题意就不多说了,真是怀疑了为什么做这题的时候竟然想用nlog(n)的那个算法, 根本不可能有解啊,真想抽自己一下,最后无奈看了题解,发现他们写的非常棒,记录路径仅用一个数组就可以实现,可惜我没有想到啊,还是做题不深入啊. 首先需要排一下序. 代码如下: #include <iostream> #include

hdu-1160 FatMouse&#39;s Speed 【最长上升子序列】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9965    Accepted Submission(s): 4427 Special Judge Problem Description FatMo

FatMouse&#39;s Speed(HDU-1160)

一道经典的最长子序列题,不过该题需要维护两个量,体重和速度,所以需要先对一个量进行排序,然后剩下的那个量就可以像处理最长子序列那样做了. 值得一提的是该题需要打印路径,最好的方法是用一个数组pre运用类似链表的结构,来记录路径. 这恰恰就是紫书上数据结构那章例题14中所用的记录最短路路径的方法 . 其中的巧妙和实现细节请读者细细品味. 针对这道题, 由于dp是利用之前计算的结果进行递推得到的,因此,每一步的计算都要用到上一步的结.最长上升子序列,就是枚举当前序列的最后一位,然后从前面递推找最优解

[FatMouse&#39;s Speed] LIS

Description HDU-1160 FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are incr

动态规划(DP),类似LIS,FatMouse&#39;s Speed

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weight相同的按照speed从大到小排列; 2.Count[i]表示到第i个老鼠时,所求的最长“速度递减”子序列的长度: 3.path[i]=j是题目的关键,记录在Count[i]=Count[j]时,即最长“速度递减”子序列最后一个老鼠的前一只老鼠的位置 4.递归输出id void output(in

HDU 1160 FatMouse&#39;s Speed DP题解

本题就先排序老鼠的重量,然后查找老鼠的速度的最长递增子序列,不过因为需要按原来的标号输出,故此需要使用struct把三个信息打包起来. 查找最长递增子序列使用动态规划法,基本的一维动态规划法了. 记录路径:只需要记录后继标号,就可以逐个输出了. #include <stdio.h> #include <algorithm> using namespace std; const int MAX_N = 1005; struct MouseSpeed { int id, w, s; b

(最长上升子序列 并记录过程)FatMouse&#39;s Speed -- hdu -- 1160

http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12338    Accepted Submission(s): 5405Special Judge Problem Description FatMouse be

hdu 1160 FatMouse&#39;s Speed(dp)

http://acm.hdu.edu.cn/showproblem.php?pid=1160 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; struct Node { int w,s,id,fa; }; Node mice[1000+10]; int dp[100

HDU 1160 FatMouse&#39;s Speed (动规+最长递减子序列)

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9174    Accepted Submission(s): 4061 Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster