1. 程式人生 > >[UVA - 11039] Building designing 題解

[UVA - 11039] Building designing 題解

mat max 輸入 最大 裏的 其中 一行 包含 etc

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接(vjudge):https://vjudge.net/problem/UVA-11039

題目大意:

輸入包含多組數據。第一行為數據組數T。

接下來每組數據給出一個長度為n(n <= 500000)的數字序列,每個數字的大小∈(-99999,99999).

請選出其中最長的一段序列,使得序列中數字的絕對值遞增,且正負號交替。輸出這個最大長度。

樣例輸入:

2
5
7
-2
6
9
-3
8
11
-9
2
5
18
17
-15
4

樣例輸出:

2
5

分析:

註意題目裏的“正負號交替”並沒有限定第一個數是正數,“負正號交替”也可以。樣例真的良心qwq

用結構體存儲數,按照絕對值排序,然後用一個變量不斷異或來控制正負號交替。

AC代碼:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 
 7 const int MAXN = 500005;
 8 
 9 inline void read(int &x)
10 {
11     char ch = getchar(),c = ch;x = 0
; 12 while(ch < 0 || ch > 9) c = ch,ch = getchar(); 13 while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar(); 14 if(c == -) x = -x; 15 } 16 17 int t,n,cnt,need; 18 //need標記接下來需要的數字是正是負 19 struct NUM 20 { 21 int v,abs,flag;
22 }num[MAXN]; 23 24 int cmp(NUM a,NUM b) 25 {return a.abs < b.abs;} 26 27 int main() 28 { 29 read(t); 30 while(t --) 31 { 32 read(n); 33 for(int i = 1;i <= n;++ i){ 34 read(num[i].v); 35 if(num[i].v < 0) num[i].flag = 1,num[i].abs = -num[i].v; 36 else num[i].flag = 0,num[i].abs = num[i].v; 37 } 38 std::sort(num+1,num+1+n,cmp); 39 cnt = 0; 40 for(int i = 1;i <= n;++ i) 41 if(i == 1 || need == num[i].flag){ 42 ++ cnt; 43 if(i == 1) need = num[i].flag ^ 1; 44 else need ^= 1; 45 } 46 printf("%d\n",cnt); 47 } 48 return 0; 49 }

[UVA - 11039] Building designing 題解