第一题:
hdu 4576 Robot
之前没有做,根本不敢想怎么去算,数太大了,其实算一算,还是可以的,时间是4s,1s 10^8,。 比赛时大家做主要卡在卡在开数组上,后来想到滚动数组,很轻易就A了。
没有任何技巧的题目,一步一步算,dp[0][i]表示当前落在i的概率,所以想用dp[1][i]存一下当前操作后落在i的概率,再传给dp[0][i],将dp[1][i]置为0,继续下一次操作。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
double dp[2][210];
int main()
{
int n,m,l,r;
int ll,rr;
double sum;
while(scanf("%d%d%d%d",&n,&m,&l,&r))
{
if(n==0&&m==0&&l==0&&r==0)
return 0;
memset(dp,0,sizeof(dp));
dp[0][1]=1;
int a;
while(m--)
{
scanf("%d",&a);
for(int i=1; i<=n; i++)
{
if(dp[0][i]==0)
continue;
/*ll=(i+n-a)%n; 这样写是3406ms
rr=(i+n+a)%n;
if(ll==0)
ll=n;
if(rr==0)
rr=n;*/
ll=i-a; //这样写是2643ms
while(ll<=0)
ll+=n;
rr=i+a;
while(rr>n)
rr-=n;
dp[1][ll]+=(dp[0][i]/2);
dp[1][rr]+=(dp[0][i]/2);
}
for(int i=1; i<=n; i++)
{
dp[0][i]=dp[1][i];
dp[1][i]=0;
}
}
sum=0;
for(int i=l; i<=r; i++)
{
sum+=dp[0][i];
}
printf("%.4lf\n",sum);
}
}
第九题:
Hdu 4584
做题时说是最水的一道,的确,随便暴力一下就过了,顺序不用多考虑,因为找H是是按x小到大,然后y从小到大的,‘C'也是
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char map[100][100];
int main()
{
int i1,j1,i2,j2;
int x1,y1,x2,y2;
int m,n;
while(cin>>m>>n)
{
if(!m&&!n)
break;
for(int i=0; i<m; i++)
cin>>map[i];
int d=1000;
int ans;
for(i1=0; i1<m; i1++){
for(j1=0; j1<n; j1++){
if(map[i1][j1]=='H'){
for(i2=0; i2<m; i2++){
for(j2=0;j2<n;j2++){
if(map[i2][j2]=='C'){
ans=abs(i1-i2)+abs(j1-j2);
if(ans<d)
{
d=ans;
x1=i1;y1=j1;
x2=i2;y2=j2;
}
}
}
}
}
}
}
cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
}
return 0;
}
第十题
hdu 4585
用到了set,临时看了别人的博客学习着写的。
lower_bound 函数返回大于等于这个数的元素下标。
set中元素是已经排好序的,所以插入、删除、查找等操作复杂度都为log(n);
#include<iostream>
#include<cstdio>
#include<string>
#include<set>
#include<map>
using namespace std;
int main()
{
int n,k,g;
set<int>st;
map<int,int>mp;
while(scanf("%d",&n)&&n)
{
st.clear();
mp.clear();
st.insert(1000000000);
mp[1000000000]=1;
while(n--)
{
scanf("%d%d",&k,&g);
printf("%d ",k);
set<int>::iterator it=st.lower_bound(g);
if(it==st.end())
{
it--;
printf("%d\n",mp[(*it)]);
}
else
{
if(it!=st.begin())
{
int tmp=*it;
it--;
if(tmp-g>=g-(*it))
printf("%d\n",mp[(*it)]);
else
printf("%d\n",mp[tmp]);
}
else
printf("%d\n",mp[(*it)]);
}
st.insert(g);
mp[g]=k;
}
}
return 0;
}