NOIP2017题解

Day1

T1 小凯的疑惑

#include<cstdio>
int main()
{
    long long a,b;
    scanf("%lld%lld",&a,&b);
    printf("%lld",a*b-a-b);
    return 0;
}

T2 时间复杂度

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

typedef long long ll;

const int Maxn=1100;

int t,n,s[Maxn],top,ans,err;

char a[Maxn],b[Maxn][Maxn];

int rfs(char *a) {
    int ans=0,now=0;
    char ch=a[0];
    while(ch<'0'||ch>'9') ch=a[++now];
    while(ch>='0'&&ch<='9') {
        ans=ans*10+ch-'0';
        ch=a[++now];
    }
    return ans;
}

int work() {
    int ans=0;
    top=0;
    for(int i=1;i<=n;i++) {
        if(b[i][0]=='F') if(s[top]!=-1) {
            int now=4;
            char ch=b[i][now];
            int temp1=0;
            int temp2=0;
            if(b[i][now]=='n') {
                if(b[i][now+2]=='n') {
                    top++;
                    s[top]=s[top-1];
                    continue;
                }
                else {
                    s[++top]=-1;
                    continue;
                }
            }
            else {
                while(ch<'0'||ch>'9') ch=b[i][++now];
                while(ch>='0'&&ch<='9') {
                    temp1=temp1*10+ch-'0';
                    ch=b[i][++now];
                }
                if(b[i][now+1]=='n') {
                    top++;
                    s[top]=s[top-1]+1;
                    ans=max(ans,s[top]);
                    continue;
                }
                while(ch<'0'||ch>'9') ch=b[i][++now];
                while(ch>='0'&&ch<='9') {
                    temp2=temp2*10+ch-'0';
                    ch=b[i][++now];
                }
                if(temp1>temp2) {
                    s[++top]=-1;
                    continue;
                }
                else {
                    top++;
                    s[top]=s[top-1];
                    continue;
                }
            }
        }
        else s[++top]=-1;
        else top--;
    }
    return ans;
}

void getal(char *a) {
    char ch=getchar();
    while(ch!='F'&&ch!='E') ch=getchar();
    int now=0;
    while(ch!='\n') {
        a[now++]=ch;
        ch=getchar();
    }
}

int main() {
//  freopen("testdata.in","r",stdin);
    scanf("%d",&t);
    while(t--) {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        err=0;
        scanf("%d%s",&n,a);
        if(a[2]=='n') ans=rfs(a);
        else ans=0;
        for(int i=1;i<=n;i++) getal(b[i]);
        int temp=0;
        for(int i=1;i<=n;i++) {
            if(b[i][0]=='F') temp++;
            else temp--;
            if(temp<0) {
                err=1;
                break;
            }
        }
        if(temp) err=1;
        if(err) {
            puts("ERR");
            continue;
        }
        top=0;
        for(int i=1;i<=n;i++) {
            if(b[i][0]=='F') {
                s[++top]=b[i][2];
                for(int j=0;j<top;j++) if(s[j]==s[top]) {
                    err=1;
                    break;
                }
            }
            else top--;
            if(err) break;
        }
        if(err) {
            puts("ERR");
            continue;
        }
        if(work()==ans) puts("Yes");
        else puts("No");
    }
    return 0;
}

T3 逛公园

Day2

T1 奶酪

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

typedef long long ll;

const int Maxn=1100;

int n,t,f[Maxn];

ll r,x[Maxn],y[Maxn],z[Maxn],h;

int find(int x) {
    if(x!=f[x]) f[x]=find(f[x]);
    return f[x];
}

int main() {
    scanf("%d",&t);
    while(t--) {
        int flag=0;
        scanf("%d%lld%lld",&n,&h,&r);
        ll r2=4*r*r;
        for(int i=0;i<=n;i++) f[i]=i;
        for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);
        for(int i=1;i<=n;i++) if(z[i]<=r) f[i]=0;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                if(r2>=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]))
                    if(find(i)!=find(j))
                        f[f[i]]=f[j];
        for(int i=1;i<=n;i++) if(h-z[i]<=r) if(find(i)==find(0)) {
            flag=1;
            puts("Yes");
            break;
        }
        if(flag==0) puts("No");
    }
    return 0;
}

T2 宝藏

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

typedef long long ll;

const int Maxn=11000;
const int Maxm=21;
const ll inf=0x3f3f3f3f3f3f3f;

ll n,m,b[Maxm][Maxm],x,y,z;
ll f[Maxn],g[Maxn],q1[Maxn],q2[Maxn],q3[Maxn],c[Maxn],t1,t2,t3;
int bj[Maxn];

int main() {
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            b[i][j]=inf;
    for(int i=1;i<=m;i++) {
        scanf("%lld%lld%lld",&x,&y,&z);
        b[x][y]=min(b[x][y],z);
        b[y][x]=b[x][y];
    }
    ll ans=inf;
    int end=(1<<n)-1;
    for(int i=0;i<=end;i++) f[i]=inf;
    for(int i=1,temp=1;i<=n;i++,temp<<=1) f[temp]=0,q1[++t1]=temp;
    int cnt=1;
    while(1) {
        t2=0;
        memset(bj,0,sizeof(bj));
        for(int i=0;i<=end;i++) g[i]=inf;
        for(int i=1;i<=t1;i++) {
            t3=0;
            for(int j=1,temp=1;j<=n;j++,temp<<=1)
                if((q1[i]&temp)==0) {
                    t3++;
                    c[t3]=inf;
                    q3[t3]=temp;
                    int tempt=t3;
                    for(int k=1,tempp=1;k<=n;k++,tempp<<=1)
                        if(q1[i]&tempp)
                            c[t3]=min(c[t3],b[j][k]);
                    for(int i=1;i<tempt;i++) {
                        t3++;
                        q3[t3]=q3[i]|temp;
                        c[t3]=c[tempt]+c[i];
                    }
                }
            for(int j=1;j<=t3;j++) {
                int s=q1[i]|q3[j];
                if(f[q1[i]]+cnt*c[j]<=f[s]) {
                    if(bj[s]==0) {
                        q2[++t2]=s;
                        bj[s]=1;
                    }
                    g[s]=min(g[s],f[q1[i]]+cnt*c[j]);
                }
            }
        }
        for(int i=0;i<=end;i++) f[i]=g[i];
        t1=t2;
        for(int i=1;i<=t1;i++) q1[i]=q2[i];
        if(t1==0) break;
        ans=min(ans,f[end]);
        cnt++;
    }
    if(n==1) ans=0;
    printf("%lld\n",ans);
    return 0;
}

T3 列队

猜你喜欢

转载自www.cnblogs.com/shanxieng/p/9589991.html
今日推荐