[UVA - 11039] Building designing 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[UVA - 11039] Building designing 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接(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 题解的主要内容,如果未能解决你的问题,请参考以下文章
UVa 11039 Building designing (贪心+排序+模拟)