大魏要求学弟学妹们拍的时候站成两排,右边的比左边的要高,还要后面的比前面的那个人高一些。
请你帮他算算,如果有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
****************************************************************/
大家都知道最长上升子序列算法,但是你们有没有考虑过在最长上升子序列当中那些不能舍去的元素呢?那些所谓的不能舍去的元素是指假如去掉这个元素,那么最长上升子序列长度就会减少。
现在有一个长度为n的序列,需要你找出那些不能舍去的元素。
还没有做。
你们可曾计划过今年暑假的毕业旅行呢?当年阳仔毕业旅行时,本来预计去的10个城市,结果因为没做足准备,才去了5个城市,并且白浪费了很多大洋在一个城市周转。今年他为了弥补上回的缺憾,打算再一次周游旅行,并且这次他计划了50个城市!!!阿门!!!
你们也知道的,周游旅行需要大笔费用。因此,阳仔打算坐动车,并将所到城市都拍张照片留作纪念。暑假2个月时间并不是所有城市都有动车可以直达的,如果某个城市没有动车,那他只能放弃去那个城市了。另外,可以保证如果动车可以从A->B,那么这班动车也可以从B->A。请你帮阳仔算下,阳仔开始所在城市编号为0,要到达所有的其他可以到达的城市,这一波旅行的最短路程是多少?
未完成。
大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有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
****************************************************************/
动物园的猴子吃坚果的顺序都是按强壮程度来定的,最强壮的吃完才能轮到下一个,现在我们给出各个猴子的名字,强壮程度,吃饱的量,然后查询对应的猴子必须要扔多少坚果才可以轮到。
第一次排序是为了模拟猴子吃的过程,第二次是为了多次查找提高效率。
#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 ****************************************************************/