地址: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;
}