九度OJ 1412(卡特蘭數) 1413(未完成) 1414(未完成) 1415(循環隊列) 1416(排序)


1412:畢業合影

題意

大魏要求學弟學妹們拍的時候站成兩排,右邊的比左邊的要高,還要後面的比前面的那個人高一些。
請你幫他算算,如果有n個人來拍,按照大魏要求的方式排,會有多少種不同的方式呢。

思路

一開始沒啥思路,後來看了別人的題解才發現是卡特蘭數。。。
卡特蘭數真的無處不在。

代碼

#include <stdio.h>

#define N 40

int main(void)
{
    int n, i;
    long long h[N+1];

    while (scanf("%d", &n) != EOF)
    {
        h[0] = 1;
        for(i=1; i<=n/2; i++)
            h[i] = h[i-1]*(4*i-2)/(i+1);
        printf("%lld\n", h[n/2]);
    }

    return 0;
}
/**************************************************************
    Problem: 1412
    User: liangrx06
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:912 kb
****************************************************************/

題目1413:神祕元素

題意

大家都知道最長上升子序列算法,但是你們有沒有考慮過在最長上升子序列當中那些不能捨去的元素呢?那些所謂的不能捨去的元素是指假如去掉這個元素,那麼最長上升子序列長度就會減少。
現在有一個長度爲n的序列,需要你找出那些不能捨去的元素。

思路

還沒有做。

代碼


1414:旅遊啦

題意

你們可曾計劃過今年暑假的畢業旅行呢?當年陽仔畢業旅行時,本來預計去的10個城市,結果因爲沒做足準備,纔去了5個城市,並且白浪費了很多大洋在一個城市週轉。今年他爲了彌補上回的缺憾,打算再一次周遊旅行,並且這次他計劃了50個城市!!!阿門!!!
你們也知道的,周遊旅行需要大筆費用。因此,陽仔打算坐動車,並將所到城市都拍張照片留作紀念。暑假2個月時間並不是所有城市都有動車可以直達的,如果某個城市沒有動車,那他只能放棄去那個城市了。另外,可以保證如果動車可以從A->B,那麼這班動車也可以從B->A。請你幫陽仔算下,陽仔開始所在城市編號爲0,要到達所有的其他可以到達的城市,這一波旅行的最短路程是多少?

思路

未完成。

代碼


1415:不一樣的循環隊列

題意

大家都知道數據結構裏面有一個結構叫做循環隊列。顧名思義,這是一個隊列,並且是循環的。但是現在,淘氣的囧哥給這個循環隊列加上了一些規矩,其中有5條指令:
(1) Push K, 讓元素K進隊列。
(2) Pop,對頭元素出隊列。
(3) Query K,查找隊列中第K個元素,注意K的合法性。
(4) Isempty,判斷隊列是否爲空。
(5) Isfull,判斷隊列是否已滿。
現在有N行指令,並且告訴你隊列大小是M。

思路

循環隊列的實現,通常空出一個位置不用以區分空隊列和滿隊列兩種狀態。具體實現見代碼。
C語言比較笨,不像C++直接可以用STL中的queue,但這樣也有個好處是練習一下實現基礎數據結構。

代碼

#include <stdio.h>
#include <string.h>

#define M 100000

int q[M+1], front, rear, m;

void init()
{
    front = rear = 0;
}

int Isempty()
{
    return (front == rear);
}

int Isfull()
{
    return (front == (rear+1)%m);
}

int push(int val)
{
    if (Isfull())
        return 0;
    q[rear] = val;
    rear = (rear+1)%m;
    return 1;
}

int pop(int *val)
{
    if (Isempty())
        return 0;
    *val = q[front];
    front = (front+1)%m;
    return 1;
}

int Query(int k, int *val)
{
    int count = (rear+m-front)%m;
    if (k <= 0 || k > count)
        return 0;
    *val = q[(front+k-1)%m];
    return 1;
}

int main(void)
{
    int n, i;
    char op[10];
    int k, val;

    while (scanf("%d%d", &n, &m) != EOF)
    {
        m ++;
        init();
        for(i=0; i<n; i++)
        {
            scanf("%s", op);
            if (strcmp(op, "Push") == 0)
            {
                scanf("%d", &k);
                if (! push(k))
                    printf("failed\n");
            }
            if (strcmp(op, "Pop") == 0)
            {
                if (! pop(&k))
                    printf("failed\n");
            }
            if (strcmp(op, "Query") == 0)
            {
                scanf("%d", &k);
                if (! Query(k, &val))
                    printf("failed\n");
                else
                    printf("%d\n", val);
            }
            if (strcmp(op, "Isempty") == 0)
            {
                if (! Isempty())
                    printf("no\n");
                else
                    printf("yes\n");
            }
            if (strcmp(op, "Isfull") == 0)
            {
                if (! Isfull())
                    printf("no\n");
                else
                    printf("yes\n");
            }
        }
    }

    return 0;
}       
/**************************************************************
    Problem: 1415
    User: liangrx06
    Language: C
    Result: Accepted
    Time:140 ms
    Memory:1304 kb
****************************************************************/

1416:猴子喫堅果

題意

動物園的猴子喫堅果的順序都是按強壯程度來定的,最強壯的喫完才能輪到下一個,現在我們給出各個猴子的名字,強壯程度,喫飽的量,然後查詢對應的猴子必須要扔多少堅果纔可以輪到。

思路

第一次排序是爲了模擬猴子喫的過程,第二次是爲了多次查找提高效率。

代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 10000

typedef struct node {
    char name[101];
    int a;
    int b;
    int need;
} MK;

int cmp1(const void *x, const void *y)
{
    if (((MK *)y)->a != ((MK *)x)->a)
        return ((MK *)y)->a - ((MK *)x)->a;
    else
        return strcmp(((MK *)x)->name, ((MK *)y)->name);
}

int cmp2(const void *x, const void *y)
{
    return strcmp(((MK *)x)->name, ((MK *)y)->name);
}

int main(void)
{
    int n, m, i;
    MK mk[N];
    char name[101];

    while (scanf("%d%d", &n, &m) != EOF)
    {
        for (i=0; i<n; i++)
            scanf("%s%d%d", mk[i].name, &mk[i].a, &mk[i].b);
        qsort(mk, n, sizeof(mk[0]), cmp1);
        int sum = 0;
        for (i=0; i<n; i++)
        {
            mk[i].need = sum + 1;
            sum += mk[i].b;
        }
        qsort(mk, n, sizeof(mk[0]), cmp2);
        for (i=0; i<m; i++)
        {
            scanf("%s", name);
            MK *p = bsearch(&name, mk, n, sizeof(mk[0]), cmp2);
            if (p != NULL)
                printf("%d\n", p->need);
        }
    }

    return 0;
}
/**************************************************************
    Problem: 1416
    User: liangrx06
    Language: C
    Result: Accepted
    Time:80 ms
    Memory:1976 kb
****************************************************************/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章