[UVA - 11039] Building designing 題解
阿新 • • 發佈:2017-10-11
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 題解