NOIP-2016-普及组 复赛题解

T1 (Pencil)

随便做

#include 
using namespace std;
int n,a,b,ans=2147483647;

int main(){
    freopen("pencil.in","r",stdin);
    freopen("pencil.out","w",stdout);
    scanf("%d",&n);
    for (int i=1; i<=3; i++) {
        scanf("%d%d",&a,&b);
        int k=0,s=0;
        for (; kif (sprintf("%d",ans);
    return 0;
}

T2(date)

枚举每个 月(1=>12)、日(1=>day[i]),再判断此日期符不符合(把月日反过来就是年)
注意二月二十九号推出的日期是 92200229,9220年是个闰年,可以直接用就行了

#include 
using namespace std;
int day[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int A,B,ans,maxy,miny,maxm,minm,maxd,mind;

int check(int m,int d){
    int y;
    y=(d%10)*1000+(d/10)*100+(m%10)*10+(m/10);
    if (y>miny && yreturn 1;
    if (y==miny){
        if (m>minm) return 1;
        if (m==minm && d>=mind) return 1;
    }
    if (y==maxy){
        if (mreturn 1;
        if (m==maxm && d<=maxd) return 1;
    }
    return 0;
}

int main(){
    freopen("date.in","r",stdin);
    freopen("date.out","w",stdout);
    ans=0;
    scanf("%d%d",&A,&B);
    maxy=B/10000, maxm=(B%10000)/100, maxd=B%100;
    miny=A/10000, minm=(A%10000)/100, mind=A%100;
    for (int i=1; i<=12; i++)                   //枚举月
        for (int j=1; j<=day[i]; j++)           //枚举日
            ans+=check(i,j);
    printf("%d",ans);
    return 0;
}

T3(port)

边读边算(利用题目中t[i]是递增的)
head 符合题目到达最早的船的编号
t: 每艘船时间
p: 每艘船第一个人的编号
q: 每个国家的人数
w: 每人来自的国家
ans: 当前的答案
du()是读入优化,也用来压行

#include 
int n,ans,head;
int t[100010],p[100010],q[100010],w[500000];
int du(){
    int rd=0;
    char ch=getchar();
    while (ch<48 || ch>57) ch=getchar();
    while (ch>47 && ch<58) rd=rd*10+ch-'0',ch=getchar();
    return rd;
}

int main(){
    freopen("port.in","r",stdin);
    freopen("port.out","w",stdout);
    n=du();
    p[1]=1, head=1;
    for (int i=1; i<=n; i++){
        t[i]=du();
        int rs=du();
        p[i+1]=p[i]+rs;
        for (int j=1; j<=rs; j++) if (!q[w[j+p[i]-1]=du()]++) ans++;
        while (t[i]-t[head]>=86400){
            for (int k=p[head]; k1]; k++) if (--q[w[k]]==0) ans--;
            head++;
        }
        printf("%d\n",ans);
    }
}

T4(magic) 还未AC,先给个50分程序……

其中用了些剪枝:
xa< xb< xc< xd 没得说
xb-xa=2(xd-xc) 说明(xb-xa)为偶数
xb-xa<(xc-xb)/3 可在枚举c时判断

#include 
int A[15010],B[15010],C[15010],D[15010],x[15010];
int n,m;

int main(){
    freopen("magic.in","r",stdin);
    freopen("magic.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1; i<=m; i++)scanf("%d",&x[i]);
    for (int a=1; a<=m; a++)
        for (int b=1; b<=m; b++) if (x[b]>x[a] && (x[b]-x[a])%2==0)
            for (int c=1; c<=m; c++) if (x[c]>x[b] && (x[b]-x[a])*3<(x[c]-x[b]))
                for (int d=1; d<=m; d++) if (x[d]>x[c] && (x[b]-x[a]==2*(x[d]-x[c]))){
                    A[a]++;
                    B[b]++;
                    C[c]++;
                    D[d]++;
                }

    for (int i=1; i<=m; i++) printf("%d %d %d %d\n",A[i],B[i],C[i],D[i]);
}

你可能感兴趣的:(NOIP)