[贪心] COJ 1236 删数游戏

每次查找第一个降序的首字符,如果不存在就删除结尾字符,链表,O(n)。

# include <cstdio>

# include <iostream>



using namespace std;



struct node

{

    char ch;

    node *pre, *next;

};



void b(node *head, char *s)

{

    head->ch = s[0];

    node *tmp = head;

    for (int i = 0; s[i]; ++i)

    {

        node *cur = new node;

        cur->ch = s[i+1];

        tmp->next = cur;

        cur->pre  = tmp;

        cur->next = NULL;

        tmp = cur;

    }

}



node* d(node *head, int n)

{

    node *tmp = head;

    while (n)

    {

        if ((tmp->ch) > (tmp->next->ch))

        {

            --n;

            if (tmp == head)

            {

                head = head->next;

                head->pre = NULL;

                delete tmp;

                tmp = head;

            }

            else

            {

                node *cur = tmp->pre;

                tmp->pre->next = tmp->next;

                tmp->next->pre = tmp->pre;

                delete tmp;

                tmp = cur;

            }

        }

        else tmp = tmp->next;

    }

    return head;

}



void p(node *head)

{

    node *cur = head;

    while (cur->ch == '0') cur = cur->next;

    if (cur->ch == '\0') puts("0");

    else

    {

        while (cur->ch != '\0')

        {

            putchar(cur->ch);

            cur = cur->next;

        }

        putchar('\n');

    }

}



void k(node *p)

{

    if (p->next)

    {

        k(p->next);

        delete p;

    }

}



int ss;

char nn[2005];



void solve(void)

{

    node *head = new node;

    head->pre = NULL;

    head->next = NULL;

    b(head, nn);

    head = d(head, ss);

    p(head);

    k(head);

}



int main()

{    

    while (~scanf("%s%d", nn, &ss))

        solve();

    

    return 0;

}

 

你可能感兴趣的:(游戏)