uva 11039 - Building designing(贪心)
2013-12-09 20:14
295 查看
题目链接:uva 11039 - Building designing
题目大意:给出n个数,均为非0数,要求选出尽量多的数组成序列,序列要求正负交替,绝对值递增。
解题思路:读入时将正数与负数分别储存在两个数组,负数可以直接储存绝对值。然后将两个数组按照绝对大小分别排序,然后在两个数组中交替选出尽量小的数,满足绝对值大于前面一个选出的数。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 500005;
int n, l, r, left
, right
;
void init() {
l = r = 0;
memset(right, 0, sizeof(right));
memset(left, 0, sizeof(left));
int c;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &c);
if (c < 0) left[l++] = -c;
else right[r++] = c;
}
sort(left, left + l);
sort(right, right + r);
}
int solve() {
if (l && r) {
int p, q, begin, ans = 1, tmp;
if (left[0] < right[0]) {
p = 1, q = 0, begin = 0;
tmp = left[0];
}
else {
p = 0, q = 1, begin = 1;
tmp = right[0];
}
for (int i = begin; p < l || q < r; i++) {
bool flag = true;
if (i % 2) {
// if (p >= l) break;
while (p < l) {
if (tmp <= left[p]) {
ans++;
tmp = left[p++];
flag = false;
break;
} else p++;
}
} else {
// if (q >= r) break;
while (q < r) {
if (tmp <= right[q]) {
ans++;
tmp = right[q++];
flag = false;
break;
} else q++;
}
}
if (flag) break;
}
return ans;
} else return 1;
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
printf("%d\n", solve() );
}
return 0;
}
题目大意:给出n个数,均为非0数,要求选出尽量多的数组成序列,序列要求正负交替,绝对值递增。
解题思路:读入时将正数与负数分别储存在两个数组,负数可以直接储存绝对值。然后将两个数组按照绝对大小分别排序,然后在两个数组中交替选出尽量小的数,满足绝对值大于前面一个选出的数。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 500005;
int n, l, r, left
, right
;
void init() {
l = r = 0;
memset(right, 0, sizeof(right));
memset(left, 0, sizeof(left));
int c;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &c);
if (c < 0) left[l++] = -c;
else right[r++] = c;
}
sort(left, left + l);
sort(right, right + r);
}
int solve() {
if (l && r) {
int p, q, begin, ans = 1, tmp;
if (left[0] < right[0]) {
p = 1, q = 0, begin = 0;
tmp = left[0];
}
else {
p = 0, q = 1, begin = 1;
tmp = right[0];
}
for (int i = begin; p < l || q < r; i++) {
bool flag = true;
if (i % 2) {
// if (p >= l) break;
while (p < l) {
if (tmp <= left[p]) {
ans++;
tmp = left[p++];
flag = false;
break;
} else p++;
}
} else {
// if (q >= r) break;
while (q < r) {
if (tmp <= right[q]) {
ans++;
tmp = right[q++];
flag = false;
break;
} else q++;
}
}
if (flag) break;
}
return ans;
} else return 1;
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
printf("%d\n", solve() );
}
return 0;
}
相关文章推荐
- UVa 11039 Building designing (贪心+排序+模拟)
- uva 11039 贪心法
- UVa 11039 - Building designing(贪心)
- UVA 11039(模拟,贪心)
- 贪心水题。UVA 11636 Hello World,LA 3602 DNA Consensus String,UVA 10970 Big Chocolate,UVA 10340 All in All,UVA 11039 Building Designing
- UVA 11039 Building designing 贪心
- UVa 11039 (排序+贪心) Building designing
- uva 11039 - Building designing(贪心)
- UVA 11039-Building designing【贪心+绝对值排序】
- [UVA-11039] Building designing(贪心)
- UVa11039 - Building designing(排序+贪心)
- (UVA - 11039)Building designing (贪心)
- UVA 10714 Ants 蚂蚁 贪心+模拟 水题
- uva 10718 Bit Mask(贪心)
- UVA - 10706 Number Sequence(贪心)
- uva 434 - Matty's Blocks(贪心)
- UVa 10465 - Homer Simpson(背包&贪心)
- UVa 11292 - Dragon of Loowater[贪心]
- uva 10905 题解(贪心水题)
- uvalive 2326(贪心)