1. 程式人生 > >【寧波市第23屆中小學生計算機程序設計競賽(初中組)T3】馬(排序,最長不下降子序列)

【寧波市第23屆中小學生計算機程序設計競賽(初中組)T3】馬(排序,最長不下降子序列)

決定 pri 需要 程序設計 分開 組成 最長 只有一個 應該

題目描述

戰神阿瑞斯聽說2008年在中華大地上,將舉行一屆規模盛大的奧林匹克運動會,心中頓覺異常興奮,他召集了n位天將,騎著他們自己的天馬,準備在廣闊的天空上,舉行一場空前的天馬天將列隊表演。天馬在熟悉了自己的天將以後,已經是將馬合一,不能分開了。戰神阿瑞斯想在這n匹天馬和n個天將中選出盡可能多的天馬和天將,組成一個隊列,該隊列必須同時滿足:
(1)隊列中天將的高度加上天馬的高度之和,後一個應該比前一個大。
(2)隊列中後一個天馬高度不低於前一個天馬高度,隊列中後一個天將高度不低於前一個天將高度。
應該怎樣選才能使隊列的長度最大呢?你能給戰神阿瑞斯參謀參謀嗎?

輸入

輸入文件horse.in 的第一行只有一個正整數n,表示共有n匹馬和n個天將。
第二行共有n個正實數,分別表示每匹天馬的高度,第i個數表示第i匹天馬的高度。這n個數之間互相以一個空格分隔。
第三行共有n個正實數,分別表示每個天將的身高,第i個數表示第i個天將的高度。這n個數之間互相以一個空格分隔。

輸出

輸出文件horse.out中只有一行,該行只有一個正整數,為符合條件的最長隊列長度。

按照馬的高度排序,若發現相鄰兩人馬與將身高都一致,則“刪除”此節點,然後再排一次。由於此時馬的高度已經排好,我們只需要求出以將軍高度決定的最長不下降子序列即可。

 1 #include <algorithm>
 2 #include <cstdio>
 3  
 4 struct fighters{
 5     float h,f;
 6 }a[9001];
 7  
 8 int n,ans,tot=1;
 9 float maxn,f[9001];
10 #define max(x,y) (x>y?x:y)
11
12 bool cmp(fighters x,fighters y){ 13 if(x.h==y.h)return x.f<y.f; 14 return x.h<y.h; 15 } 16 17 int main(void){ 18 scanf("%d",&n); 19 for(int i=1;i<=n;++i) 20 scanf("%f",&a[i].h); 21 for(int i=1;i<=n;++i) 22 scanf("%f",&a[i].f); 23 std::sort(a+1
,a+n+1,cmp); 24 for(int i=1;i<n;++i) 25 if((a[i].f==a[i+1].f)&&(a[i].h==a[i+1].h)) 26 a[i].f=10; 27 std::sort(a+1,a+n+1,cmp); 28 f[1]=a[1].f; 29 for(int i=2;i<=n;++i){ 30 if(a[i].f>=f[tot]){ 31 f[++tot]=a[i].f; 32 continue; 33 } 34 int j=std::upper_bound(f+1,f+tot+1,a[i].f)-f; 35 f[j]=a[i].f; 36 } 37 printf("%d",tot); 38 }

【寧波市第23屆中小學生計算機程序設計競賽(初中組)T3】馬(排序,最長不下降子序列)