2013 杭州赛区邀请赛

第一题:

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


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值