迎接2012新赛季——HDOJ系列热身赛(2)还是弱的没治啊。。。

1000 http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1000&cid=387

水题,水过》注意一下,把第一个数标记下来。否则后面的a[n- 1]和a[0]处理是会影响结果

1001 http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=387

才开始想开个二维字符型数组一个一个的读出来,然后按字符排序,结果管开数组就已经不行了。。太大了。。

后来是边读边比较,结果果断的TLE了好几次。。最后我又记录最小的字符的位置,结果还是TLE.....

郁闷了很久,听von说的思路,原来只要存储那些连续最小的元素的个数与位置然后,读出来排序就行。。。可是中间又是因为初始化的问题WA了好几次。。。唉。。

当在主函数外定义char型数组时,默认为空,当在主函数里面定义时,默认色是?...

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define maxn 300007
using namespace std;

char a[maxn],rs[maxn];
struct node
{
int num;
int pos;
}tagp[maxn],tmp[maxn];
char s1[maxn],s2[maxn];
int cmp(node a,node b)
{
return a.num > b.num;
}
int main()
{
int i,len,j;
while (gets(a) != NULL)
{
len = strlen(a);
memset(rs,0,sizeof(rs));
for (i = 0; i < len; ++i)
{
j = (i + 1 + len)%len;
if (a[j] >= a[i])
rs[i] = a[j] - a[i] + '0';
else
rs[i] = a[j] + 8 - a[i] + '0';
}
//printf("%s\n",rs);
char m = '9';
for (i = 0; i < len; ++i)
{
if (m > rs[i]) m = rs[i];
}
//printf("%c\n",m);
memset(tagp,0,sizeof(tagp));
int k = 0;
//记录最小的元素,位置与个数
for (i = 0;i < len; ++i)
{
if (m == rs[i])
{
int ct = 1;
for (j = i + 1; j < len; ++j)
{
if (m != rs[j]) break;
ct++;
}
tagp[k].num = ct;
tagp[k].pos = i;
k++;
i = j - 1;
}
}
sort(tagp,tagp + k,cmp);
/*for (i = 0; i < k; ++i)
printf("%d %d\n",tagp[i].num,tagp[i].pos);
*/
memset(s1,0,sizeof(s1));
for (i = 0; i < len; ++i)
s1[i] = '9';
int ki;
memset(s2,0,sizeof(s2));//注意这里的出始化。。
for (i = 0; i < k; ++i)
{
//找最小元素连续出现最大,然后比较
if (tagp[i].num == tagp[0].num)
{
ki = 0;
for (j = tagp[i].pos; j < len; ++j)
s2[ki++] = rs[j];
for (j = 0; j < tagp[i].pos; ++j)
s2[ki++] = rs[j];
//printf(">>>%s\n",s2);
if (strcmp(s1,s2) > 0)
{
for(ki = 0; ki < len; ++ki)
s1[ki] = s2[ki];
}
}
else
{
break;
}
}
printf("%s\n",s1);
}
return 0;
}

1002http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=387

求签m小,前n大。。。

1004 http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=387

卡塔兰数。。直接套公式h[n] = (h[n-1]*(4*n-2))/(n+1);

View Code
#include <iostream>
#include <cstdio>
using namespace std;
__int64 h[35];
int main()
{
int i,n;
h[1] = 1;
for (i = 2; i < 31; ++i)
{
h[i] = ((h[i-1]*(4*i-2))/(i+1));
}
while (scanf("%d",&n),n)
{
printf("%I64d\n",h[n]);
}
return 0;
}



转载于:https://www.cnblogs.com/E-star/archive/2012/03/03/2378645.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值