问题描述
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;
}