版权声明:反正都没人抄我博客的 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就这样没了