您的位置:首页 > 编程语言

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

2013-03-22 16:41 417 查看
//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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐