FatMouse的速度
时间限制:2000/1000ms (Java /其他)内存限制:65536/32768K (Java /其它)
总提交(s): 23日接受提交(s): 11
特殊的法官
问题描述
FatMouse认为胖的一只老鼠,它运行得越快。 为了证明这一点,你想把老鼠的数据收集尽可能大的这些数据的一个子集序列,这样重量增加,但速度下降。
输入
输入数据包含一群老鼠,每行一个鼠标,终止结束的文件。 数据为一个特定的鼠标将包括两个整数:第一个代表克它的大小,第二个代表厘米每秒的速度。 都在1到10000之间的整数。 每个测试用例中的数据将包含信息最多1000只老鼠。 两只老鼠可能有相同的重量,同样的速度,甚至同样的重量和速度。
输出
你的程序应该输出一个序列行数据; 第一行应该包含一个n; 剩下的n线都应该包含一个正整数(每一个代表鼠标)。 如果这些n个整数m [1], [2],… ,m [n]那必须的 W [m [1]] < W [m [2]] <… < W [m [n]] 和 S [m [1]] > [m [2]] >… > S [m [n]] 为了让答案是正确的,应该尽可能大。 所有的不平等都是严格的:必须严格增加重量,速度必须严格递减。 可能有很多正确的输出对于一个给定的输入,程序只需要找到一个。
样例输入
6008 1300
6000 2100
500 2000
1000 4000
1100 3000
6000 2000
8000 1400
6000 1200
2000 1900
样例输出
4
4
5
9
7
在这里插入代码片#include<bits/stdc++.h>
using namespace std;
struct arr{
int w,s;
int hao;
}shu[1050];
int dp[1050],lode[1050],ans[1005];
bool aee(arr a,arr b){
if(a.w==b.w){
return a.s<b.s;
}
return a.w<b.w;
}
int main(){
int i=1;
while(cin>>shu[i].w>>shu[i].s){
shu[i].hao=i;
dp[i]=1;
lode[i]=0;
i++;
}
sort(shu+1,shu+i,aee);
int n=i-1;
int maxl=0,maxi;
//判断第i只老鼠前是否有
for(int i = 2 ; i <= n ; i++){
for(int j = 1; j <i ;j++ ){
if(shu[i].w>shu[j].w&&shu[i].s<shu[j].s&&dp[i]<dp[j]+1)
//如果i老鼠比j老鼠重且跑的慢 and j老鼠前满足序列长度+1(把i老鼠算进去)比长
{
dp[i]=dp[j]+1;
lode[i]=j;//表示这个序列中在i老鼠后面的是j老鼠,用于最后输出
}
}
if(dp[i]>maxl){
//maxl:当前满足条件的最长子序列的长度;
maxl=dp[i];
maxi=i;//最长子序列中最后的老鼠对应的位置;
}
}
int temp=maxi;
int x=0;
while(temp!=0){
ans[x]=temp;
temp=lode[temp];
x++;
}
cout<<maxl<<endl;
for(int q = maxl-1 ;q >= 0; q--){
cout<<shu[ans[q]].hao<<endl;
}
return 0;
}