ROUND 4の NEERC Eastern Subregional2011

来源:互联网 发布:淘宝上靠谱的法国代购 编辑:程序博客网 时间:2024/05/20 16:12

A:Passenger Comfort

分析:这种题目要想好:问你最大和最小的速度,我们分两种情况:1:h>x*t  这时候临界条件无法到达h,我们求最小时间肯定跑最大速度,所以最小的时间设为y,有vy+x(t-y)=h,最大肯定是t,2:h<=x*t时最小时间还是跑最大速度为tmin=h/v,最大时间跑临界速度,tmax=h/x;

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<set>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )const int INF=0x3f3f3f3f;#define push_back pbtypedef long long LL;int h,t,v,x;int main(){    while(~scanf("%d%d%d%d",&h,&t,&v,&x))    {        double mi,mx;        if(h>x*t)        {            mi=(h-x*t)*1.0/(v-x);            mx=t;        }        else        {            mi=0;            mx=h*1.0/x;        }        printf("%.8f %.8f\n",mi,mx);    }    return 0;}


C:Frequent Flyer Card

分析:首先我们根据题意要求出最后每个数字的概率p[i],那么我们求到每个概率之后

应该求得到0~9牌的期望.dp[st]=(dp[st]p[st]+dp[s']p[s']+dp[s'']p[s'']....)+1--->(1-p[st])dp[st]=s+1

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<set>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )const int INF=0x3f3f3f3f;typedef long long LL;const int maxn=(1e5+100)*2;int a[30],b[30],c[30];int num[30];double p[30],dp[30][30],d[1100];int n;double dfs(int st){    if(st==1024-1)        return 0;    if(d[st]!=-1)        return d[st];    double s1=0,s2=0;    for(int i=0;i<10;i++)    {        if(st&(1<<i))            s1+=p[i];        else            s2+=p[i]*dfs(st|(1<<i));    }    return d[st]=(s2+1)/(1-s1);}int main(){    while(~scanf("%d",&n))    {        REPF(i,1,n)          scanf("%d",&a[i]);        REPF(i,1,n)          scanf("%d",&b[i]);        REPF(i,1,n)          scanf("%d",&c[i]);        CLEAR(dp,0);dp[0][1]=1;        for(int i=1;i<=n;i++)        {           CLEAR(num,0);           for(int j=0;j<10;j++)              num[(j*j*a[i]+b[i]*j+c[i])%11]++;           for(int j=0;j<11;j++)             for(int k=0;k<11;k++)               dp[i][(j*k)%11]+=dp[i-1][k]*num[j]/10;        }        dp[n][0]+=dp[n][10];        int flag=1;        for(int i=0;i<10;i++)        {            if(dp[n][i]<1e-10)                flag=0;            p[i]=dp[n][i];        }        for(int i=0;i<(1<<10);i++)            d[i]=-1;        if(!flag)            puts("-1");        else            printf("%.8f\n",dfs(0));    }    return 0;}

E:Airport Announcements

分析:直接map暴力一下就好了复杂度O(N^2)

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<set>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )const int INF=0x3f3f3f3f;#define push_back pbtypedef long long LL;char str[1010][25];map<string,int>mp;int st[1010],vis[1010];int ans[1010];int main(){    int n;char temp[25];    while(~scanf("%d",&n))    {        mp.clear();        int tot=1;        REPF(i,1,n)        {           scanf("%s",str[i]);           if(strcmp(str[i],"unknown")==0)               continue;           if(!mp[str[i]]) mp[str[i]]=tot++;           st[mp[str[i]]]=i;        }        int c=0;        for(int i=1;i<=n;i++)        {            if(n%i!=0) continue;            int flag=1;            CLEAR(vis,0);            for(int j=1;j<=n;j+=i)            {                int cnt=0;                for(int k=j;k<j+i;k++)                {                   if(strcmp(str[k],"unknown")!=0&&!vis[mp[str[k]]])                   {                        cnt++;                        strcpy(temp,str[k]);                        vis[mp[str[k]]]=1;                   }                }                if(cnt==0||(cnt==1&&st[mp[temp]]<j+i))                    vis[mp[temp]]=1;                else                {                    flag=0;                    break;                }            }            if(flag)                ans[c++]=n/i;        }        sort(ans,ans+c);        if(c==0)            puts("Igor is wrong.");        else        {            for(int i=0;i<c;i++)                printf(i==c-1?"%d\n":"%d ",ans[i]);        }    }}

F:Money out of Thin Air

分析:做一下DFS序,然后线段树搞一下就行了,比赛的时候线段树一个地方错了,坑了整场

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<set>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )const int INF=0x3f3f3f3f;#define push_back pbtypedef long long LL;const int maxn=(1e5+100)*2;LL add[maxn<<2];LL sum[maxn<<2];int n,m,tot;struct node{    int to,next;}e[maxn<<2];int head[maxn],dfn;LL val[maxn],C[maxn];int L[maxn],R[maxn];void addedge(int u,int v){    e[tot].to=v;e[tot].next=head[u];    head[u]=tot++;}void dfs(int u){    L[u]=++dfn;    for(int i=head[u];i!=-1;i=e[i].next)    {        int to=e[i].to;        dfs(to);    }    R[u]=dfn;}void pushdown(int rs,int s){    if(add[rs])    {        add[rs<<1]+=add[rs];        add[rs<<1|1]+=add[rs];        sum[rs<<1]+=add[rs]*(s-(s>>1));        sum[rs<<1|1]+=add[rs]*(s>>1);        add[rs]=0;    }}void pushup(int rs){    sum[rs]=sum[rs<<1]+sum[rs<<1|1];}void build(int rs,int l,int r){    add[rs]=sum[rs]=0;    if(l==r)    {        sum[rs]=val[l];        return ;    }    int mid=(l+r)>>1;    build(rs<<1,l,mid);    build(rs<<1|1,mid+1,r);    pushup(rs);}void update(int x,int y,LL c,int l,int r,int rs){    if(l>=x&&r<=y)    {        sum[rs]+=c*(LL)(r-l+1);        add[rs]+=c;        return ;    }    int mid=(l+r)>>1;    pushdown(rs,r-l+1);    if(x<=mid) update(x,y,c,l,mid,rs<<1);    if(y>mid)  update(x,y,c,mid+1,r,rs<<1|1);    pushup(rs);}LL query(int x,int y,int l,int r,int rs){    if(l>=x&&r<=y)        return sum[rs];    int mid=(l+r)>>1;    pushdown(rs,r-l+1);    LL res=0;    if(x<=mid) res+=query(x,y,l,mid,rs<<1);    if(y>mid)  res+=query(x,y,mid+1,r,rs<<1|1);    return res;}int main(){    int x;    LL w,y;    char str[20];    while(~scanf("%d%d%I64d",&n,&m,&w))    {        tot=0;        dfn=0;        CLEAR(head,-1);        C[1]=w;        REPF(i,2,n)        {            scanf("%d%d",&x,&w);            x++;C[i]=(LL)w;            addedge(x,i);        }        dfs(1);        build(1,1,n);        for(int i=1;i<=n;i++)             update(L[i],L[i],C[i],1,n,1);        while(m--)        {            scanf("%s%d%I64d%I64d",str,&x,&y,&w);            x++;            if(str[0]=='e')            {                if(query(L[x],L[x],1,n,1)<y)                    update(L[x],L[x],w,1,n,1);            }            else            {                if(query(L[x],R[x],1,n,1)<(LL)y*(R[x]-L[x]+1))                    update(L[x],R[x],w,1,n,1);            }        }        for(int i=1;i<=n;i++)            printf("%I64d\n",query(L[i],L[i],1,n,1));    }    return 0;}/*4 3 10 100 101 10employee 2 15 1employee 3 5 100department 0 10 1000000*/

I:A380

分析:签到模拟

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<set>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )const int INF=0x3f3f3f3f;#define push_back pbtypedef long long LL;char str[110];int main(){    int x;char op;    while(~scanf("%s",str))    {        x=0;        int len=strlen(str);        for(int i=0;i<len;i++)        {            if(isdigit(str[i]))            {                for(int j=i;j<len;j++)                {                    if(!isdigit(str[j]))                    {                        op=str[j];                        break;                    }                    x=x*10+str[j]-'0';                }                break;            }        }        //cout<<"fuck  "<<x<<" "<<op<<endl;        int c;        if(x>=1&&x<=2)        {            if(op=='A'||op=='D')                c=1;            else c=2;        }        else if(x>=3&&x<=20)        {            if(op=='A'||op=='F')                c=1;            else if(op=='B'||op=='C'||op=='D'||op=='E')                c=2;            else                c=3;        }        else        {            if(op=='A'||op=='K')                c=1;            else if(op=='C'||op=='D'||op=='G'||op=='H')                c=2;            else c=3;        }        if(c==1)            puts("window");        else if(c==2)            puts("aisle");        else            puts("neither");    }}



0 0
原创粉丝点击