[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 (贪心+排序+模拟)

UVA - 11039 B - Building designing

[UVA-11039]Children's Game

UVA1605-Building for UN(思维)

UVa1605 Building for UN (构造法)

UVa 1605 - Building for UN