18.9.22 noip模拟赛

此题为找规律。期望100 实际100

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
long long len1,len2;
long long n,s1,t1,s2,t2;
long long abss(long long x){
    if(x<0)    return -x;
    else return x;
}
long long maxx(long long x,long long y){
    if(x>y)    return x;
    else return y;
}
int main(){
    freopen("grid.in","r",stdin);
    freopen("grid.out","w",stdout);
    cin>>n>>s1>>t1>>s2>>t2;
    len1=abss(s1-s2);len2=abss(t1-t2);
    cout<<maxx(len1,len2)<<endl;
}

 期望20~40  实际20  感觉第二部分的部分分可以枚举所有可行的字符串,然后判断是否可行,但是炸掉了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T,type,n,tot,num;
char s[50010];
string ans[130000];
void dfs(int be,string sbef){
    string smid;
    for(int i=be;i>=3;i--){
        smid+=s[i];
        int lenn=smid.length();
        if(type==0){
            if(smid!=sbef)
            if(smid.length()==2||smid.length()==3){
                ans[++num]=smid;
                dfs(i-1,smid);
            }
        }
        else{
            if(smid.length()==2||smid.length()==3){
                ans[++num]=smid;
                dfs(i-1,smid);
            }
        }
        if(smid.length()>3)    break;
    }
}
int main(){
    freopen("ling.in","r",stdin);
    freopen("ling.out","w",stdout);
    scanf("%d%d",&T,&type);
    while(T--){
        cin>>s;
        int len=strlen(s);
        if(len<=20){
            dfs(len-1,"abcd");
            for(int i=1;i<=num;i++){
                int lenn=ans[i].length();
                string simm=ans[i];
                for(int j=0;j<lenn;j++)
                    ans[i][j]=simm[lenn-j-1];
            }
            sort(ans+1,ans+1+num);
            for(int i=1;i<=num;i++)
                if(ans[i]!=ans[i-1])    tot++;
            cout<<tot<<endl;
            for(int i=1;i<=num;i++)
                if(ans[i]!=ans[i-1])    cout<<ans[i]<<endl;
            num=0;tot=0;
        }
        else if(type==1){
            for(int i=len-1;i>=3;i-=3){
                string smid;
                for(int j=i;j>=3;j--){
                    smid+=s[j];
                    if(i-j==2||i-j==1)
                        ans[++num]=smid;
                    if(i-j>2)    break;
                }
            }
            for(int i=len-1;i>=3;i-=2){
                string smid;
                for(int j=i;j>=3;j--){
                    smid+=s[j];
                    if(i-j==2||i-j==1)
                        ans[++num]=smid;
                    if(i-j>2)    break;
                }
            }
            for(int i=1;i<=num;i++){
                int lenn=ans[i].length();
                string simm=ans[i];
                for(int j=0;j<lenn;j++)
                    ans[i][j]=simm[lenn-j-1];
            }
            sort(ans+1,ans+1+num);
            for(int i=1;i<=num;i++)
                if(ans[i]!=ans[i-1])    tot++;
            cout<<tot<<endl;
            for(int i=1;i<=num;i++)
                if(ans[i]!=ans[i-1])    cout<<ans[i]<<endl;
            num=0;tot=0;
        }
    }
}
View Code

期望10   实际10

 也就只会写他是条链的暴力了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T,q,num=1,tot,deepmax;
long double ans;
int son[500010],deep[500010];
int to[500010],net[500010],head[500010];
void add(int u,int v){
    to[++tot]=v;net[tot]=head[u];head[u]=tot;
}
long double pow(long double x,int num){
    long double bns=x;
    for(int i=1;i<num;i++)
        bns*=x;
    return bns;
}
void work(int now,int de){
    for(int i=head[now];i;i=net[i]){
        deep[de]+=son[to[i]];
        deepmax=(deepmax,de);
        work(to[i],de+1);
    }
}
int main(){
    freopen("threebody.in","r",stdin);
    freopen("threebody.out","w",stdout);
    scanf("%d%d",&T,&q);
    if(q>2000&&q<=3000){
        for(int i=1;i<=q;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            if(x==1)    num++;
            else if(x==2){
                for(int j=0;j<num-y;j++)
                    ans+=pow(0.5,j+1)*j;
                ans+=pow(0.5,num-y)*(num-y);
                printf("%.10lf\n",double(ans));
            }
            ans=0;
        }
    }
    else{
        for(int i=1;i<=q;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            if(x==1){
                num++;son[y]++;
                add(y,num);
            }
            else if(x==2){
                deep[1]=son[y];
                work(y,2);
                /*for(int j=1;j<=deepmax;j++)    cout<<deep[i]<<" ";cout<<endl;*/
                for(int j=1;j<=deepmax;j++){
                    long double bns=1.0;
                    for(int k=1;k<=j;k++)
                        bns=bns*(1-pow(0.5,deep[k]));
                    bns=bns*pow(0.5,deep[j+1]);
                    ans+=bns*j;
                }
                printf("%.10lf\n",double(ans));
                ans=0;
            }
        }
    }
}
/*
0 6
2 1
1 1
1 2
1 3
1 4
2 1
*/
View Code

猜你喜欢

转载自www.cnblogs.com/cangT-Tlan/p/9690068.html