2013腾讯马拉松初赛第一场(3.21)比赛(hdu4505、hdu4506、hdu4508、hdu4509)

来源:互联网 发布:遗传算法 优缺 编辑:程序博客网 时间:2024/04/27 15:48
先把这个做过的报告分享下。

1、地址:http://acm.hdu.edu.cn/showproblem.php?pid=4505
此题目比较简单,解法可以有很多,我采用了标记数组的方法。也可以直接 排序,然后for循环 求出
#include<iostream>#include<cstring>using namespace std;int main(){int C,N,a[105];cin>>C;while(C--){cin>>N;int i,x,T,sum;memset(a,0,sizeof(a));for(i=0;i<N;i++){cin>>x;a[x]++;}T=0,sum=0;for(i=0;i<=100;i++){if(a[i]){sum+=6*(i-T);sum+=5;sum+=a[i];T=i;}}sum+=4*T;cout<<sum<<endl;}return 0;}


2、地址:http://acm.hdu.edu.cn/showproblem.php?pid=4506
此题 快速幂求余,

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define MAXN 10010#define MOD 1000000007__int64 num[MAXN];int ans[MAXN];//int POW(__int64 k,int t){    if(t == 0)        return 1;    __int64 r = 1;    while(t > 1)    {        if(t&1)//t&1  如果是偶数  不执行            r = (r*k)%MOD;        k = (k*k)%MOD;        t /= 2;    }    return (r*k)%MOD;}//int main(){    int T,i,j,n,t,k,p;    __int64 tmp;    scanf("%d",&T);    while(T--)    {        scanf("%d%d%d",&n,&t,&k);        for(i = 0; i < n; i++)            scanf("%d",&num[i]);        p = t%n;        tmp = POW(k,t);        for(i = 0; i < n; i++)        {            j = (i + p)%n;            ans[j] = (num[i] * tmp)%MOD;        }        printf("%d",ans[0]);        for(i = 1; i < n; i++)            printf(" %d",ans[i]);        printf("\n");    }    return 0;}



3、暂时没明白(思考中) 按位dp

4、 地址:
http://acm.hdu.edu.cn/showproblem.php?pid=4508
完全背包。背包 9讲 看懂了  碰见背包的题目就 很easy。背包9讲很强大啊,需要耐心看。我还需要继续努力。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define MAXN 100005#define Max(a,b) (a)>(b)?(a):(b)int dp[MAXN];int main(){    int n,w[110],v[110],nMax,i,j;    while(scanf("%d",&n)!=EOF)    {        for(i = 0; i < n; i++)            scanf("%d%d",&v[i],&w[i]);        scanf("%d",&nMax);        memset(dp,0,sizeof(dp));        for(i = 0; i < n; i++)        {            for(j = w[i]; j <= nMax; j++)            {                dp[j] = Max(dp[j],dp[j-w[i]] + v[i]);            }        }        printf("%d\n",dp[nMax]);    }    return 0;}

5 、地址:http://acm.hdu.edu.cn/showproblem.php?pid=4509
 题目简单。数组  区域覆盖。可以得到结果。
#include<iostream>#include<cstring>#include<cstdio>using namespace std;int main(){int n;int time[1500];while(cin>>n){int a1,a2,b1,b2,a,b;int i,sum;memset(time,-1,sizeof(time));while(n--){scanf("%d:%d %d:%d",&a1,&a2,&b1,&b2);a=a1*60+a2,b=b1*60+b2;memset(time+a,0,(b-a)*sizeof(int));}sum=0;for(i=0;i<1440;i++){if(time[i])sum++;}printf("%d\n",sum);}return 0;}