2016年NOIP普及组复赛【ezoi】题解

版权声明:反正都没人抄我博客的 https://blog.csdn.net/qq_42372343/article/details/82954100

2016年NOIP普及组复赛【ezoi】题解:

第一题:P1909 买铅笔

思路:毫无疑问的送分题,这题只要考虑两种可能:
1、n个人分若干盒铅笔刚好分完
2、n个人分若干盒铅笔多了(题目规定不能拆开,所以只能多不能少)

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int n,i,j,a[4][3],num,sum,ans=1e8;
int main(){
	scanf("%d",&n);
	for(i=1;i<=3;i++){
		for(j=1;j<=2;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(i=1;i<=3;i++){
		num=n;
		if(num%a[i][1]!=0){
			num+=a[i][1];
		}
		sum=num/a[i][1];
		sum*=a[i][2];
		ans=min(ans,sum);
	}
	printf("%d",ans);
} 
/*
输入1: 
57
2 2
50 30
30 27

输出1:
54 

输入2: 
9998
128 233
128 2333
128 666

输出2:
18407

输入3: 
9999
101 1111
1 9999
1111 9999

输出3:
89991
*/

第二题:P2010 回文日期

思路:回文数的前一半确定后,则整个回文数也就确定了。故枚举年份,直接可以得出与该年份构成回文的月和日,然后直接判断即可。我对这道题有些心理阴影,在考试中理解错题题意,打表只打到今年[脑残以为能过],结果……

40分代码:

#include<cstdio>
using namespace std;
int a,b,ans=0,i=-1,k[40]={10011001,10100101,10111101,10200201,10211210,10300301,10400401,10500501,10600601,10700701,10800801,10900901,11011011,11100111,11111111,11200211,11211211,11300311,11400411,11500511,11600611,11700711,11800811,11900911,12011021,12100121,12111121,12200221,12211221,12300321,12400421,12500521,12600621,12700721,12800821,12900921,20011002,20100102,20111102};
int main(){
	scanf("%d%d",&a,&b);
	while(i<39){
		i++;
		if(k[i]>a){
			break;
		}
	}
	for(int j=i;k[j]<=b&&j<39;j++){
		ans++;
	}
	printf("%d",ans);
}
/*
输入1:20110101
20111231

输出1:
1

输入2:
20000101
20101231

输出2: 
2
*/ 

AC代码:

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
string d1,d2;
int d11,d12,d13,d14,d21,d22,d23,d24,md[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},m,ans=0,n1,n2,h1,h2;
int main(){
    cin>>d1>>d2;
    d11=d1[0]*10+d1[1]-528;
	d12=d1[2]*10+d1[3]-528;
	d13=d1[4]*10+d1[5]-528;
	d14=d1[6]*10+d1[7]-528;
    d21=d2[0]*10+d2[1]-528;
	d22=d2[2]*10+d2[3]-528;
	d23=d2[4]*10+d2[5]-528;
	d24=d2[6]*10+d2[7]-528;
    n1=d11*100+d12,n2=d21*100+d22;
    for(int i=n1;i<=n2;i++){
        if((i%4==0&&i%100!=0)||i%400==0){
			md[2]=29;
		}else{
			md[2]=28;
		}
        for(int k=1;k<=12;k++){
            for(int l=1;l<=md[k];l++){
                if(i==n1&&k<d13){
					continue;
				}
                if(i==n1&&k==d13&&l<d14){
					continue;
				}
                h1=(i%10)*1000+((i%100-i%10)/10)*100+((i/100-i/1000*10))*10+(i/1000)*1,h2=k*100+l;
                if(h1==h2){
					ans++;
				}
            }
        }
    }
    printf("%d",ans);
}

第三题:P2058 海港

思路:其实思想很简单,因为船是按时间来的,所以相当于对时间排好了序,所以每次输出都是在1天时间内,就相当与不断维持一个 1天的时间段,剩下就是队列了QAQ

代码:[别鄙视本蒟蒻的模拟队列]

#include<cstdio>
using namespace std;
struct Dat{
    int t,contry;
}p[300005];
int n,vis[100005],ans=0,t,k,i,j;
long long c=0,ck=0;
int main(){
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d%d",&t,&k);
        for(j=0;j<k;j++){
            scanf("%d",&p[c].contry);
            if(!vis[p[c].contry]) ans++;//这个国家没人来就ans++
            vis[p[c].contry]++;
            p[c].t=t;
            c++;
        }
        while(t-p[ck].t>=86400){
            vis[p[ck].contry]--;
            if(!vis[p[ck].contry]) ans--;
            ck++;
        }
        printf("%d\n",ans);
    }
}

注:大家看见csdn有同样代码的话别举报,因为那就是我的……

第四题:P2119 魔法阵

思路:唉,别人还暂时没AC,个人做法是枚举ABCD,然鹅TLE40分……

TLE代码:

int main(){
	while(1){
		printf("恶搞万岁");
	}
}

OK就这样没了

猜你喜欢

转载自blog.csdn.net/qq_42372343/article/details/82954100