FatMouse's Speed
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12849 Accepted Submission(s): 5641
Special Judge
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.
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.
思路:
最長上升子序列。
路徑記錄是關鍵。
之前用這種方法輸出結果wa了:
int k=1,pre=-1;
for(int i=1;i<=cnt&&k<=len;i++){
if(dp[i]==k){
if(pre==-1||(st[i].s!=st[pre].s&&st[i].w!=st[pre].w)){
printf("%d\n",st[i].id);
pre=i;
k++;
}
}
}
這種情況還是有可能包括速度或者質量相同的, 因爲dp[i]==k的老鼠會存在多個。
代碼:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1005;
struct node{
int w,s;
int id;
}st[N];
int dp[N],pre[N];
//pre[i] 表示第i只老鼠前面老鼠的下標
bool cmp(node n1,node n2){
return n1.s>n2.s;
}
int main()
{
int s,w;
int cnt=0;
while(~scanf("%d%d",&w,&s)){
st[++cnt].w=w;
st[cnt].s=s;
st[cnt].id=cnt;
}
memset(pre,-1,sizeof(pre));
sort(st+1,st+cnt+1,cmp);
int len=0,li;
for(int i=1;i<=cnt;i++){
dp[i]=1;
for(int j=1;j<i;j++) if(st[j].w<st[i].w&&st[i].s!=st[j].s){
if(dp[j]+1>dp[i]) pre[i]=j,dp[i]=dp[j]+1;
}
if(dp[i]>len) len=dp[i],li=i;
}
printf("%d\n",len);
int prin[N];
int t=len;
while(li!=-1){
prin[t--]=li;
li=pre[li];
}
for(int i=1;i<=len;i++){
printf("%d\n",st[prin[i]].id);
}
return 0;
}