FatMouse's Speed(dp胖老鼠)

问题描述
FatMouse认为,鼠标越胖,它的运行速度就越快。为了证明这一点,您希望将数据收集到一组小鼠上,并将这些数据的尽可能大的子集放入序列中,以使权重增加,但速度却降低。

输入值
输入包含一堆鼠标的数据,每行一只鼠标,由文件末尾终止。特定鼠标的数据将由一对整数组成:第一个整数表示以克为单位的大小,第二个整数表示以厘米/秒为单位的速度。两个整数都在1到10000之间。每个测试用例中的数据将包含最多1000只小鼠的信息。两只老鼠可能具有相同的体重,相同的速度,甚至具有相同的体重和速度。

输出量
您的程序应输出一系列数据行;第一行应包含数字n;其余n行应分别包含一个正整数(每个代表鼠标)。如果这n个整数是m [1],m [2],…,m [n],则必须是W [m [1]] <W [m [2]] <… < W [m [n]]和S [m [1]]> S [m [2]]> …> S [m [n]]为了使答案正确,n应该等于可能。所有不平等都是严格的:权重必须严格增加,速度必须严格降低。对于给定的输入,可能有许多正确的输出,您的程序只需找到一个即可。

样本输入
6008 1300
6000 2100
500 2000
1000 4000
1100 3000
6000 2000
8000 1400
6000 1200
2000 1900

样本输出
4
4
5
9
7

资源
浙江大学训练比赛2001

  • 这个后面的4597不用跟这个一样,后台系统会自动判断对不对
  • 这题是老鼠体重越大,速度越小
  • 只要把老鼠体重从小到大排序一样,就可以把问题从二维变成一维
  • 然后就是一个简单的dp
  • 难点在于这样把值保存下来,可以先计算好,然后从最后面往前面推
  • 但我写的过于笨重
  • 下面是AC代码
#include<bits/stdc++.h>
using namespace std;
struct q1{
	int x,y,index;
}a[10005];
int dp[10005];
bool cmp(q1 a, q1 b){
	return a.x < b.x;
}
int main(){
	memset(dp,0,sizeof(dp));
	int k = 0;
	int Tmin = 10000;
	while(~scanf("%d%d",&a[k].x,&a[k].y)){
		dp[k] = 1;
		a[k].index = k + 1;
		Tmin = min(Tmin,a[k].y);
		k ++;
	}
	sort(a,a+k,cmp);
	int Max = 0;
	for(int i = 1; i < k; i++){
		int _max = 0;
		for(int j = 0; j < i; j++){
			if(a[i].x == a[j].x)continue;//体重相同的不计算
			if(a[i].y < a[j].y){
				_max = max(dp[j],_max);
			}
		}
		dp[i] += _max;
		Max = max(Max,dp[i]);
	}
	cout << Max <<endl;
	
	int aka = Max;//相当于len长
	int cnt = 0, OK[1000];//答案保存到里面
	for(int i = k-1; i > 0; i--){//从后面往前面推
		if(aka == dp[i] && Tmin <= a[i].y){
			cnt ++;
			OK[cnt] = a[i].index;
			aka --;
			Tmin = a[i].y;
		}
	}
	for(int i = cnt; i >= 1; i--){
		cout<< OK[i] <<endl;
	}
    return 0;
}

发布了46 篇原创文章 · 获赞 5 · 访问量 2678

猜你喜欢

转载自blog.csdn.net/xuhang513/article/details/104797645