noip2016 普及组

T1 买铅笔 题目传送门

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n,x,y,ans=inf;
int main()
{
    int now,nowf;
    n=read();
    for(int i=1;i<=3;i++){
        x=read(); y=read();
        if(n%x) now=n/x+1;
        else now=n/x;
        nowf=now*y;
        ans=min(ans,nowf);
    }
    printf("%d\n",ans);
    return 0;
}

T2 回文日期 题目传送门

这道题其实枚举一波年份再判就好了 当时傻逼了就直接枚举了 mdzz

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=51848250;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n;
int f[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int nx,ny,nz,tail=1,ans;
struct node{int x,y,z;}q[M];
int pd(int x){
    if(x%4) return 0;
    if(x%100==0){
        if(x%400==0) return 1;
        return 0;
    }
    return 1;
}
int check(int x){
    int sx=q[x].x,sy=q[x].y,sz=q[x].z; //printf("%04d%02d%02d\n",sx,sy,sz);
    return (sx!=nx||sy!=ny||sz!=nz);
}
void add(int k){
    int x=q[k].x,y=q[k].y,z=q[k].z+1;
    int now=pd(x);
    if(f[now][y]<z) z=1,y++;
    if(y>12) y=1,x++;
    tail++;
    q[tail].x=x; q[tail].y=y; q[tail].z=z;
}
int okay(int x){
    int ans=q[x].x*10000+q[x].y*100+q[x].z; //printf("%d\n",ans);
    int s[10];
    for(int i=1;i<=8;i++) s[i]=ans%10,ans=ans/10;
    return s[1]==s[8]&&s[2]==s[7]&&s[3]==s[6]&&s[4]==s[5];
}
int main()
{
    n=read(); q[tail].x=n/10000; q[tail].y=n/100%100; q[tail].z=n%100;
    //printf("[%d %d %d]\n",q[1].x,q[1].y,q[1].z);
    n=read(); nx=n/10000; ny=n/100%100; nz=n%100;
    if(okay(tail)) ans++;
    while(check(tail)){
        add(tail);
        if(okay(tail)) ans++;
    }
    printf("%d\n",ans);
    return 0;
}

T3 海港 题目传送门

这道题搞了个队列记一波就okay了 代码简洁

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=100007,mx=86400;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int sum[M];
struct node{int t,w;}q[3*M];
int head,tail,n,last,k,x,tot;
int main()
{
    n=read();
    for(int i=1;i<=n;i++){
        last=read(); k=read();
        for(int i=1;i<=k;i++){
            x=read();
            if(!sum[x]) tot++;
            sum[x]++;
            q[tail].t=last; q[tail++].w=x;
        }
        while(q[head].t+mx<=last&&head<tail){
            int now=q[head++].w;
            sum[now]--;
            if(!sum[now]) tot--;
        }
        printf("%d\n",tot);
    }
    return 0;
}

T4 魔法正 题目传送门

这道题 还是有点复杂了 自己没写出来 看了波题解开着

首先由题目可得 设c-d差距为i 则a-b距离是2i b-c距离要大于6i 这样我们外层枚举i内层枚举d就可以解决问题了

当然由于a,b可以由c,d推过来但是满足情况的c,d太多了所以要从边界模拟过来使得所有被枚举的c,d都合法 把这些合法的状态都累加起来算就比较方便 降一波复杂度

同理c,d

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=45007,maxN=15007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int sum,xa,xb,xc,xd;
int n,m,id[M],w[maxN];
int a[maxN],b[maxN],c[maxN],d[maxN];
int main()
{
    n=read(); m=read();
    for(int i=1;i<=m;i++) id[i]=read(),w[id[i]]++;
    for(int i=1;i<=n/9;i++){
        int now=i*9;
        sum=0;
        for(xa=n-now-1;xa;xa--){
            xb=xa+2*i; xc=xb+6*i+1; xd=xc+i;
            sum+=w[xc]*w[xd];
            a[xa]+=w[xb]*sum;
            b[xb]+=w[xa]*sum;
        }
        sum=0;
        for(xd=now+1;xd<=n;xd++){
            xc=xd-i; xb=xc-6*i-1; xa=xb-2*i;
            sum+=w[xa]*w[xb];
            c[xc]+=sum*w[xd];
            d[xd]+=sum*w[xc];
        }
    }
    for(int i=1;i<=m;i++) printf("%d %d %d %d\n",a[id[i]],b[id[i]],c[id[i]],d[id[i]]);
    return 0;
}

时间: 2024-08-10 15:11:54

noip2016 普及组的相关文章

[题解]noip2016普及组题解和心得

[前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内容不是很多吧.直接暴力,计算每种铅笔需要花费的金额. 只不过计算的时候,需要注意如下问题 如果不是整数倍,除完后要加1 神奇的Linux系统,很多人的第三个点wa了,所以要养成良好的编写代码的习惯 Code(我的源程序) 1 #include<iostream> 2 #include<fst

NOIP2016普及组复赛解题报告

提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:https://www.luogu.org/problem/show?pid=2010 T3:https://www.luogu.org/problem/show?pid=2058 T4:https://www.luogu.org/problem/show?pid=2119) 不得不说,亲历了14.1

NOIP2016普及组

嗯,今年的普及组难度-- 题目链接:http://qscoj.cn/problem/55/ 买铅笔 时间限制: 1000ms   内存限制: 128M 描述 P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物.她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同.为了公平起 见,P老师决定只买同一种包装的铅笔. 商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物. 现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至

[NOIP2016普及组]魔法阵

题目:洛谷P2119.Vijos P2012.codevs5624. 题目大意:有n件物品,每件物品有个魔法值.要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc<Xd,Xb-Xa=2(Xd-Xc),并且Xb-Xa<(Xc-Xb)/3.求每件物品作为a.b.c.d的次数. 解题思路:这真是一道锻炼思(bào)维(lì)能力的好(kēng)题! 首先枚举魔法阵的每件物品,姿势好可得65(洛谷测). 然后是强(wěi)大(suǒ)的正解. 首先利用桶排的思路保存各

【NOIP2016普及组复赛】魔法阵

题目 分析 设xd-xc为i,那么xb-xa=2i, 又因为xb-xa<(xc-xb)/3, 那么c>6i+b. 于是,先枚举i, 再分别枚举xa和xd, 根据之间的关系,用前缀和求出每一种魔法阵的每一种物品的次数. #include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algo

2017年8月14日套题记录 | 普及组

写在前面 今天登洛谷发现离Noip剩下88天了??(虽然看起有点久),然后觉得似乎水了一个暑假什么也没做(虽然学了点数据结构和一些奇奇Gaygay的东西),于是打开题库发现去年Long Happy的集训套题我似乎没有提交过,那就一天一套题,顺便码个题解+心得(雾? T2.传作业 题目描述 某十三同学一日上学迟到,此时已经开始上早自习了,所以他只好请同学帮忙把作业传到组长那里.由于刚开学不久,某十三同学还没来得及认识所有同学,所以传作业时只好找熟悉的同学.已知某十三与组长之间有N个他熟悉的同学,并

1143 纪念品分组 2007年NOIP全国联赛普及组

1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序

采药 2005年NOIP全国联赛普及组&amp;疯狂的采药

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大."

[NOIP2013] 普及组

计数问题 纯模拟 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int main(){ 5 int n,x; 6 cin>>n>>x; 7 int i,c=0; 8 for(i=1;i<=n;i++){ 9 int a=i; 10 while(a!=0){ 11 if(a%10==x)c++; 12 a/=10; 13 } 14 } 15 cout<<c;