uva_11039 - Building designing( 基數排序 )

来源:互联网 发布:linux samma 编辑:程序博客网 时间:2024/05/11 21:02
題意:有n個絕對值不同的整數(非0),選出儘量多的數,排列成一個序列,正負相間且元素絕對值遞增,求最長的序列的長度.分析:可以先存下來接着使用nlogn的排序也可,這裏用了hash的基數排序Code:#include <set>#include <map>#include <cmath>#include <ctime>#include <stack>#include <queue>#include <deque>#include <vector>#include <cstdio>#include <bitset>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define PLUS    1#define SUB     2#define ALL     3#define DIR     4#define DIM     2#define STATUS  2#define MAXN    999999 + 10#define oo      (~0u)>>1#define INF     0x3F3F3F3F#define REPI(i, s, e)   for(int i = s; i <= e; i ++)#define REPD(i, e, s)   for(int i = e; i >= s; i --)static const double EPS = 1e-5;int f[MAXN];int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE        freopen("test.in", "r", stdin);#endif        int cas, n;        scanf("%d", &cas);        REPI(k, 1, cas) {                scanf("%d", &n);                int v, max_v = 0;                memset(f, 0, sizeof(f));                REPI(i, 1, n) {                        scanf("%d", &v);                        if( v > 0 ) {                                f[v] = PLUS;                        }                        else {                                f[-v] = SUB;                        }                        max_v = max(max_v, abs(v));                }                int len = 0;                int idx = 1;                int pre = 0;                while( idx <= max_v && !f[idx] ) {                        idx += 1;                }                pre = (PLUS == f[idx])? SUB : PLUS;                while( true ) {                        if( idx > max_v ) {                                break;                        }                        while( idx <= max_v && !f[idx] ) {                                idx += 1;                        }                        if( (PLUS == pre && SUB == f[idx]) ) {                                len += 1, pre = SUB;                        }                        else if( (SUB == pre && PLUS == f[idx]) ) {                                len += 1, pre = PLUS;                        }                        idx += 1;                }                printf("%d\n", len);        }        return 0;}

原创粉丝点击