第二届腾讯编程马拉松初赛第一场。。hdu4505 hdu4506 hdu4507 hdu4508 hdu4509(未完,4507)



//1001


点击打开链接

//刚开始人全部上在电梯上。。要排下序。。。


#include"stdio.h"
#include"stdlib.h"
struct node
{
	int x;
}a[101];
int cmp(const void*a,const void*b)
{
	return (*(struct node*)a).x-(*(struct node*)b).x;
}
int main()
{
	int ans,t,n,b,i;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		
		for(i=0;i<n;i++)
			scanf("%d",&a[i].x);
		qsort(a,n,sizeof(a[0]),cmp);
		b=0;ans=0;
		for(i=0;i<n;i++)
		{
			if(a[i].x==b)ans++;
			else if(a[i].x>b)ans+=(a[i].x-b)*6+5+1;
			else ans+=(b-a[i].x)*4+5+1;
			b=a[i].x;
		}
		ans+=b*4;
		printf("%d\n",ans);
	}
	return 0;
}





//1002

点击打开链接

这道题学了:个东西::快速幂取余

#include"stdio.h"
__int64 fun(__int64 a,__int64 b,__int64 c)//a的b次方对c求余
{
	__int64 ans=1;
	a%=c;
	while(b>0)
	{
		if(b%2==1)ans=(ans*a)%c;
		b/=2;
		a=(a*a)%c;
	}
	return ans;
}
int main()
{
	int n,i,T,b[10001];
	__int64 t,k,a[10001],ans[10001];
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%I64d%I64d",&n,&t,&k);
		for(i=0;i<n;i++)
			scanf("%I64d",&a[i]);
		k=fun(k,t,1000000007);//计算k的t次方对1000000007求余
		if(k==0)k=1;
		t=t%n;//.		
		for(i=0;i<n;i++)
		{
			b[i]=i-t;//b[i]表示a[i]经过t次运算后的下标
			if(b[i]<0)b[i]+=n;//可能为负
			ans[i]=(a[b[i]]*k)%1000000007;
		}
		for(i=0;i<n-1;i++)
			printf("%I64d ",ans[i]);
		printf("%I64d\n",ans[i]);
	}
	return 0;
}





//1003






//1004


是完全背包..

背包不一定要装满!!.



#include"stdio.h"
#include"string.h"
#define max(x,y) x>y?x:y;
int dp[100001];
int main()
{
    int n,m,a[101],b[101];
    int i,j;
    while(scanf("%d",&n)!=-1)
    {
        for(i=0;i<n;i++)
            scanf("%d%d",&a[i],&b[i]);
        scanf("%d",&m);
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++)
        {
            for(j=b[i];j<=m;j++)//不一定装满
            {
                dp[j]=max(dp[j],dp[j-b[i]]+a[i]);
            }
        }
        printf("%d\n",dp[m]);
    }
    return 0;
}





//1005


线段树的题。但是可以不用模版。。。。

12:00-12:01只标记12:00,代表第12*60分钟被使用..

点击打开链接



#include"stdio.h"
#include"string.h"
int mark[1441];
void fun(char str[])
{
	int a,b,c,d;
	a=(str[0]-'0')*10+str[1]-'0';
	b=(str[3]-'0')*10+str[4]-'0';
	c=(str[6]-'0')*10+str[7]-'0';
	d=(str[9]-'0')*10+str[10]-'0';
	a=a*60+b;
	b=c*60+d;
	for(;a<b;a++)
		mark[a]=1;//如果时间是12:00-12:01标记12:00;mark[i]表示第i分钟被占用....
}
int main()
{
	int n,i,sum;
	char str[12];
	while(scanf("%d",&n)!=-1)
	{
		getchar();
		memset(mark,0,sizeof(mark));
		for(i=0;i<n;i++)
		{
			gets(str);
			fun(str);
		}
		sum=0;
		for(i=0;i<1440;i++)
			if(mark[i]==0)sum++;
		printf("%d\n",sum);
	}
	return 0;
}



posted on 2013-03-22 16:41  Slege  阅读(125)  评论(0编辑  收藏  举报

导航