现在的位置: 首页 > 综合 > 正文

20130915周赛(未完)

2018年04月24日 ⁄ 综合 ⁄ 共 4128字 ⁄ 字号 评论关闭

地址:http://www.bnuoj.com/bnuoj/contest_show.php?cid=2648

A题  POJ1845

由于题目很短,所以先做了这道题,本来以为会TLE,结果没T给WA了,后来再看觉得自己想的有些简单,正常做法应该会TLE的。。

百度了一下找到了公式和做法之后A了

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctype.h>
#include<algorithm>
using namespace std;
const int mod=9901;

long long int sum(long long int p,long long int n);
long long int power(long long int p,long long int n);

int main()
{
	int a,b,i,k=0;;
	int p[10000];
	int n[10000];
	scanf("%d%d",&a,&b);
    for(i=2;i*i<=a;i==2?i++:i+=2)
    {
        if(a%i==0)
        {
            p[k]=i;
            n[k]=0;
            while(!(a%i))
            {
                n[k]++;
                a/=i;
            }
            k++;
        }
    }
    if(a!=1)
    {
        p[k]=a;
        n[k++]=1;
    }

    int ans=1;
    for(i=0;i<k;i++)
        ans=(ans*(sum(p[i],n[i]*b)%mod))%mod;
	printf("%d\n",ans);
	return 0;
}
long long int sum(long long int p,long long int n)
{
	if(n==0)             		return 1;
	if(n%2)  		return (sum(p,n/2)*(1+power(p,n/2+1)))%mod;
	else     return (sum(p,n/2-1)*(1+power(p,n/2+1))+power(p,n/2))%mod;
}

long long int power(long long int p,long long int n)
{
	long long int sq=1;
	while(n>0)
	{
        if(n%2)
            sq=(sq*p)%mod;
        n/=2;
        p=p*p%mod;
    }
	return sq;
}

B题  HDU2476

看到题还以为是编辑距离,当时编辑距离没想起来就先放下了,后来发现不是编辑距离 = =、 不过都是dp,重点是状态转移方程,感觉dp好厉害

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctype.h>
#include<algorithm>
using namespace std;
char a1[105],a2[105];
int p[105][105],q[105];
int main()
{
    int i,ii,j,k;
    while(scanf("%s%s",a1,a2)!=EOF)
    {
        memset(p,0,sizeof(p));
        for(i=0;i<strlen(a1);i++)
        {
            for(j=i;j<strlen(a1);j++)
                p[i][j]=j-i+1;
        }
        for(ii=0;ii<strlen(a1);ii++)
        {
            for(i=0;i<strlen(a1)&&i+ii<strlen(a1);i++)
            {
                j=i+ii;
                p[i][j]=p[i+1][j]+1;
                for(k=i+1;k<=j;k++)
                {
                    if(a2[k]==a2[i])
                        p[i][j]=min(p[i][j],p[i+1][k]+p[k+1][j]);
                }
            }
        }
        if(a1[0]==a2[0])
                q[0]=0;
            else
                q[0]=1;
        for(i=1;i<strlen(a1);i++)
        {
            q[i]=p[0][i];
            if(a1[i]==a2[i])
                q[i]=q[i-1];
            else
            {
                int k;
                for(k=0;k<i;k++)
                    q[i]=min(q[i],q[k]+p[k+1][i]);
            }
        }
        printf("%d\n",q[strlen(a1)-1]);
    }
    return 0;
}

C题  Hdu 1872

这个以前做过,结构体排序。。

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<time.h>
using namespace std;
struct node
{
    char name[60];
    int score;
    int r;          //r作为标识符,为之后稳定排序做准备
};
struct node student[305],test[305];
bool cmp(struct node a,struct node b)
{
    if(a.score==b.score)    return a.r<b.r;
    else return a.score>b.score;
}
int main()
{
    int n,i,k;
    while(scanf("%d",&n)!=EOF)
    {
        k=1;                            //k==1是不稳定  k==2是稳定     k==3是error
        memset(student,0,sizeof(student));
        memset(test,0,sizeof(test));
        for(i=0;i<n;i++)
        {
            scanf("%s%d",&student[i].name,&student[i].score);
            student[i].r=i;
        }
        sort(student,student+n,cmp);
        for(i=0;i<n;i++)
        {
            scanf("%s%d",&test[i].name,&test[i].score);
            if(test[i].score>test[i-1].score&&i)   k=3;
        }
        if(k!=3)
        {
            for(i=0;i<n;i++)
            {
                if(strcmp(student[i].name,test[i].name)!=0||student[i].score!=test[i].score)    break;
            }
            if(i==n)    k=2;
        }
        if(k==1)
        {
            printf("Not Stable\n");
            for(i=0;i<n;i++)
                printf("%s %d\n",student[i].name,student[i].score);
        }
        else if(k==2)
        {
            printf("Right\n");
        }
        else if(k==3)
        {
            printf("Error\n");
            for(i=0;i<n;i++)
                printf("%s %d\n",student[i].name,student[i].score);
        }
    }
    return 0;
}

D题  HDU 1896

优先队列的题,做的时候不会。。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string.h>
#include<ctype.h>
#include<stack>
#include<queue>
#include<set>
#include<algorithm>
#include  <limits.h>
using namespace std;
struct node
{
    int pos,dis;
};
struct cmp
{
    bool operator () (node a,node b)
    {
        if(a.pos!=b.pos)
            return a.pos>b.pos;
        else
            return a.dis>b.dis;
    }
};
int main()
{
    priority_queue<node,vector<node>,cmp> q;
    int n,i,t,k;
    node p;
    scanf("%d",&t);
    while(t--)
    {
        k=1;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&p.pos,&p.dis);
            q.push(p);
        }
        while(!q.empty())
        {
            p=q.top();
            q.pop();
            if(k)
            {
                k=0;
                p.pos+=p.dis;
                q.push(p);
            }
            else
                k=1;
        }
        printf("%d\n",p.pos);
    }
    return 0;
}

E题  POJ2187

凸包问题,忘看了。。先留着

F题  HDU1548

对深搜广搜理解还不够,起初一直在用深搜做,RE了几遍 WA了几遍,原来要用广搜,如果用广搜这题就很好做了

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string.h>
#include<ctype.h>
#include<stack>
#include<queue>
#include<set>
#include<algorithm>
#include  <limits.h>
using namespace std;
int p[205],visited[205];
int n,a,b;
int main()
{
    int i,k,m;
    while(scanf("%d",&n),n)
    {
        queue<int> q;
        scanf("%d%d",&a,&b);
        memset(visited,0,sizeof(visited));
        for(i=1;i<=n;i++)
            scanf("%d",&p[i]);
        q.push(a);
        visited[a]=1;
        k=0;
        while(!q.empty())
        {
            m=q.front();
            q.pop();
            if(m==b)    {k=1;break;}
            if(m-p[m]>0&&m-p[m]<=n&&!visited[m-p[m]])
            {
                visited[m-p[m]]=visited[m]+1;
                q.push(m-p[m]);
            }
            if(m+p[m]>0&&m+p[m]<=n&&!visited[m+p[m]])
            {
                visited[m+p[m]]=visited[m]+1;
                q.push(m+p[m]);
            }
        }
        if(k)   printf("%d\n",visited[b]-1);
        else    printf("-1\n");
    }
    return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.