二、stl ,模拟,贪心等 [Cloned]

原题:

As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway. 

题意:

给出一个数,求他的卡特兰数,及出栈顺序的种数。

题解:

卡特兰数的公式为F(n)=c(2n,n)/(n+1),然而因为要求大数的卡特兰数,所以必须用数组来储存(大数真的无力),wa了好久改改补补才过掉,难点就在公式的大数处理上

代码:AC

#include<stdio.h>
#include<string.h> 
int h[101][121];
int main()
{
    int i,j,k,l,n;
    memset(h, 0, sizeof(h));
    h[0][1]=1;
	h[1][1]=1;
    for(i = 2; i <= 100; ++i)
    {
        for(j = 0; j < i; ++j) 
            for(k = 1; k < 60; ++k)
            for(l = 1; l < 60; ++l)
        	h[i][k + l - 1] += h[j][k] * h[i - j - 1][l];
        for(j = 1; j < 60; ++j)
        {
            h[i][j + 1] += h[i][j] / 10;
            h[i][j] %= 10;
        }
    }
    while(scanf("%d", &n) != EOF)
    {
        i=60;
		while( h[n][--i] == 0 )
		; 
        for(j = i; j > 0; --j)
		printf("%d", h[n][j]);
        printf("\n");
    }
    return 0;
}
	

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给您讲解一下如何模拟STL的list类。 List是一个双向链表,我们可以通过自己实现节点类和链表类来模拟这个数据结构。 首先,我们需要定义一个节点类,包含前驱节点指针、后继节点指针、以及存储数据的成员变量。代码如下: ``` template <typename T> class ListNode { public: T data; ListNode* prev; ListNode* next; ListNode(T data) : data(data), prev(nullptr), next(nullptr) {} }; ``` 接着,我们定义链表类,包含头节点指针和尾节点指针,以及一些常用的操作方法,如插入、删除、查找等。代码如下: ``` template <typename T> class List { public: List() : head(nullptr), tail(nullptr), size(0) {} ~List() { clear(); } void insert(T data) { ListNode<T>* node = new ListNode<T>(data); if (head == nullptr) { head = node; tail = node; } else { tail->next = node; node->prev = tail; tail = node; } size++; } void remove(T data) { ListNode<T>* node = head; while (node != nullptr) { if (node->data == data) { if (node == head) { head = node->next; if (head != nullptr) { head->prev = nullptr; } } else if (node == tail) { tail = node->prev; if (tail != nullptr) { tail->next = nullptr; } } else { node->prev->next = node->next; node->next->prev = node->prev; } delete node; size--; return; } node = node->next; } } ListNode<T>* find(T data) { ListNode<T>* node = head; while (node != nullptr) { if (node->data == data) { return node; } node = node->next; } return nullptr; } void clear() { ListNode<T>* node = head; while (node != nullptr) { ListNode<T>* next = node->next; delete node; node = next; } head = nullptr; tail = nullptr; size = 0; } int getSize() const { return size; } private: ListNode<T>* head; ListNode<T>* tail; int size; }; ``` 这样,我们就实现了一个简单的模拟STL的list类。您可以通过调用insert、remove、find等方法来操作链表中的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值