腾讯第二届编程马拉松初赛第二场(hdu4505、hdu4506、hdu4508、hdu4509)

hdu4505

/*

分析:
    水题。
    人是刚开始全部上到电梯上的。
                                                                                 2013-03-21
*/




#include"iostream"
#include"cstdlib"
using namespace std;

int n;
int aim[111];
int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}
int main()
{
	int T;
	int i;
	int now,ans;
	cin>>T;
	while(T--)
	{
		cin>>n;
		for(i=0;i<n;i++)cin>>aim[i];
		qsort(aim,n,sizeof(int),cmp);

		now=ans=0;
		for(i=0;i<n;i++)
		{
			if(aim[i]==now)	{if(i==0)ans+=5;ans++;continue;}
			ans+=(aim[i]-now)*6;
			now=aim[i];
			ans+=5;
			ans++;
		}
		ans+=now*4;
		cout<<ans<<endl;
	}
	return 0;
}






hdu4506:

/*
分析:
    快速幂取余的果题。
    囧~~么有看数论的队友、也么有看计算几何的队友,数学方面弱到
爆的我、这个快速幂取余是比赛的时候临时学的- -III。

                                            2013-03-21
*/






#include"iostream"
using namespace std;
const int N=10011;

int n;
__int64 t,k;
__int64 node[N],ans[N];
int pre[N];

__int64 cal(__int64 a,__int64 b,__int64 c)
{
	__int64 zz=1;
	a%=c;
	while(b>0)
	{
		if(b%2)	zz=(zz*a)%c;
		b/=2;
		a=(a*a)%c;
	}
	return zz;
}
int main()
{
	int T;
	int i;
	__int64 z,temp;
	cin>>T;
	while(T--)
	{
		cin>>n;
		scanf("%I64d%I64d",&t,&k);
		for(i=0;i<n;i++)	scanf("%I64d",&node[i]);

		if(!t)
		{
			printf("%I64d",node[0]);
			for(i=1;i<n;i++)	printf(" %I64d",node[i]);
			printf("\n");
			continue;
		}

		z=t%n;
		temp=cal(k,t,1000000007);
		if(!temp)		temp=1;
		for(i=0;i<n;i++)
		{
			pre[i]=i-z;
			if(pre[i]<0)	pre[i]+=n;
			ans[i]=(node[pre[i]]*temp)%1000000007;
		}
		printf("%I64d",ans[0]);
		for(i=1;i<n;i++)	printf(" %I64d",ans[i]);
		printf("\n");
	}
	return 0;
}





hdu4507

/*
分析:
    完全背包果题。
    小心会爆int。

                            2013-03-21
*/






#include"iostream"
using namespace std;
const int N=111;
const int M=100111;

int n,m;
int w[N],val[N];
__int64 dp[M];
__int64 max(__int64 a,__int64 b)
{
	return a>b?a:b;
}
int main()
{
	int i,l;
	while(scanf("%d",&n)!=-1)
	{
		for(i=0;i<n;i++)	cin>>val[i]>>w[i];
		cin>>m;

		memset(dp,0,sizeof(dp));
		for(i=0;i<n;i++)
		for(l=w[i];l<=m;l++)
			dp[l]=max(dp[l],dp[l-w[i]]+val[i]);

		printf("%I64d\n",dp[m]);
	}
	return 0;
}





hdu4509

/*
分析:
    线段树。
    也算是一道果题吧,只是简单的对区间的覆盖,范围也只有24*60。


                                                         2013-03-21
*/







#include"iostream"
#include"cstdlib"
using namespace std;
const int N=500111;

int n;
struct Seg
{
	int l,mid,r;
	int flag;				//有么有被覆盖
}T[4*N];
int hash[N];
void ko(int l,int r)
{
	int i;
	for(i=l;i<=r;i++)	hash[i]=1;
}
void build(int l,int r,int k)
{
	T[k].l=l;
	T[k].r=r;
	T[k].mid=(l+r)>>1;
	T[k].flag=0;
	if(l==r)	return ;
	build(l,T[k].mid,2*k);
	build(T[k].mid+1,r,2*k+1);
}
void cover(int l,int r,int k)
{
	if(T[k].l==l && T[k].r==r)
	{
		T[k].flag=1;
		return ;
	}
	if(r<=T[k].mid)		cover(l,r,2*k);
	else if(l>T[k].mid)	cover(l,r,2*k+1);
	else
	{
		cover(l,T[k].mid,2*k);
		cover(T[k].mid+1,r,2*k+1);
	}
	if(T[2*k].flag && T[2*k+1].flag)	T[k].flag=1;
}
void find(int k)
{
	int ans=0;
	if(T[k].flag)
	{
		ko(T[k].l,T[k].r);
		return ;
	}
	if(T[k].l==T[k].r)	return ;
	find(2*k);
	find(2*k+1);
}
int main()
{
	int i,l;
	char str[111];
	int a,b,s,e;
	while(scanf("%d",&n)!=-1)
	{
		build(0,24*60-1,1);
		//
		for(i=0;i<n;i++)
		{
			cin>>str;
			a=b=0;
			for(l=0;str[l]!=':';l++)	a=a*10+str[l]-'0';
			for(l++;str[l];l++)			b=b*10+str[l]-'0';
			s=a*60+b;

			cin>>str;
			a=b=0;
			for(l=0;str[l]!=':';l++)	a=a*10+str[l]-'0';
			for(l++;str[l];l++)			b=b*10+str[l]-'0';
			e=a*60+b-1;

			if(e<s)	continue;
			cover(s,e,1);
		}
		//
		memset(hash,0,sizeof(hash));
		find(1);
		//
		int ans=24*60;
		int limit=24*60;
		for(i=0;i<limit;i++)	if(hash[i])	ans--;
		cout<<ans<<endl;
	}
	return 0;
}


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值