2013 杭州赛区邀请赛

来源:互联网 发布:中兴笔试编程题 编辑:程序博客网 时间:2024/06/11 04:55

第一题:

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;}


 

 

原创粉丝点击