1.买铅笔

算法分析

不能整除则加1。

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
int main()
{int n; scanf("%d", &n);int snum, sprice;int ans = 1e8, t;for (int i = 1; i <= 3; ++i){scanf("%d%d", &snum, &sprice);t = n / snum * sprice + (n % snum == 0 ? 0 : 1) * sprice;ans = min(ans, t);}printf("%d\n", ans);
}

2.回文日期

算法分析

直接枚举每一个日期然后判断是否回文,肯定超时。注意到,对于固定年份,只能有一个回文日期,比如2142年,其生成的回文日期为21422412,然后判断这个日期是否合法即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
int v[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int shuiwen(int syear) // 1201
{return syear * 10000 + syear % 10 * 1000 + syear / 10 % 10 * 100 + syear / 100 % 10 * 10 + syear / 1000;
}
int srun(int syear)
{if ((syear % 4 == 0 && syear % 100 != 0) || syear % 400 == 0) return 1;else return 0;
}
int sjudge(int s)
{int syue = s / 1000 % 10 * 10 + s / 100 % 10;int sday = s % 100;if (syue < 1 || syue > 12) return 0;if (srun(s / 10000)) v[2] = 29; else v[2] = 28;if (sday < 1 || sday > v[syue]) return 0;return 1;
}
int main()
{int sd1, sd2, snum = 0;scanf("%d%d", &sd1, &sd2);for (int k = sd1 / 10000; k <= sd2 / 10000; ++k){int sdata = shuiwen(k); // 生成回文日期 if (sjudge(sdata) && sdata >= sd1 && sdata <= sd2) ++snum;}printf("%d\n", snum);return 0;
}

算法拓展

枚举后面四位,即枚举月份+天数,然后生成年份,效率更高。最多有366种。然后判断生成的年份是否在范围之内即可。

3.海港

算法分析

单调队列维护每艘船的情况。visvisvis数组标记国籍。对于新到来的船只,如果有国籍xxx,则++vis[x]++vis[x]++vis[x],如果此时vis[x]vis[x]vis[x]为1,则答案加1。对于队首的船只,如果要出队,如果有国籍xxx,则−−vis[x]--vis[x]−−vis[x],如果此时vis[x]vis[x]vis[x]为0,则答案减1。

用vectorvectorvector存每艘船的人员信息。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define ll long long
using namespace std;
int n, vis[100010];
int q[100010], l, r;
struct node
{int t, k;vector<int> s;
}sboot[100010];
int main()
{int n; scanf("%d", &n);int num = 0, x;l = 1, r = 0;for (int i = 1; i <= n; ++i){scanf("%d%d", &sboot[i].t, &sboot[i].k);for (int j = 1; j <= sboot[i].k; ++j){scanf("%d", &x); sboot[i].s.push_back(x);if (vis[x] == 0) ++num;++vis[x];}q[++r] = i;while (l <= r && sboot[q[l]].t <= sboot[i].t - 86400){for (int j = 0; j < sboot[q[l]].s.size(); ++j){x = sboot[q[l]].s[j];--vis[x];if (vis[x] == 0) --num;}++l;}printf("%d\n", num);}return 0;
}

4.魔法阵

算法分析

根据题目给定的关系,设xcxcxc到xdxdxd之间的距离为ttt,则xbxbxb到xcxcxc之间的距离为6t+k6t+k6t+k,kkk最小值为1。xaxaxa到xbxbxb之间的距离为2t2t2t。魔法的取值范围是[1,n][1, n][1,n],可以用visvisvis数组标记某个魔法值是否被取到,以及被取了几次。设:

cnt[x][0]cnt[x][0]cnt[x][0]表示:魔法值为xxx的魔法物品作为A出现的次数。
cnt[x][1]cnt[x][1]cnt[x][1]表示:魔法值为xxx的魔法物品作为B出现的次数。
cnt[x][2]cnt[x][2]cnt[x][2]表示:魔法值为xxx的魔法物品作为C出现的次数。
cnt[x][3]cnt[x][3]cnt[x][3]表示:魔法值为xxx的魔法物品作为D出现的次数。

以上分析中有三个未知量:aaa的位置设为xxx,ttt和kkk。枚举这三个未知量,不用具体考虑每个魔法取值是否有物品。比如:

cnt[ax][0]+=vis[bx]∗vis[cx]∗vis[dx]cnt[ax][0] += vis[bx] * vis[cx] * vis[dx]cnt[ax][0]+=vis[bx]∗vis[cx]∗vis[dx]
以上是计算魔法值axaxax作为A物品出现的次数。假如bxbxbx没有对应物品,即:vis[bx]=0vis[bx] = 0vis[bx]=0,则最后vis[bx]∗vis[cx]∗vis[dx]vis[bx] * vis[cx] * vis[dx]vis[bx]∗vis[cx]∗vis[dx]为0,对cnt[ax][0]cnt[ax][0]cnt[ax][0]没有贡献。能过约85%的数据。可考虑优化。

假设ax、bx、cx、dxax、bx、cx、dxax、bx、cx、dx这四个值构成魔法阵,则ax、bx、cx+1、dx+1ax、bx、cx+1、dx+1ax、bx、cx+1、dx+1这四个值也能构成魔法阵,ax、bx、cx+2、dx+2ax、bx、cx+2、dx+2ax、bx、cx+2、dx+2也能构成魔法阵,……

计算cnt[ax][0]cnt[ax][0]cnt[ax][0]:

cnt[ax][0]+=vis[bx]∗vis[cx]∗vis[dx]cnt[ax][0] += vis[bx] * vis[cx] * vis[dx]cnt[ax][0]+=vis[bx]∗vis[cx]∗vis[dx]
cnt[ax][0]+=vis[bx]∗vis[cx+1]∗vis[dx+1]cnt[ax][0] += vis[bx] * vis[cx+1] * vis[dx+1]cnt[ax][0]+=vis[bx]∗vis[cx+1]∗vis[dx+1]
cnt[ax][0]+=vis[bx]∗vis[cx+2]∗vis[dx+2]cnt[ax][0] += vis[bx] * vis[cx+2] * vis[dx+2]cnt[ax][0]+=vis[bx]∗vis[cx+2]∗vis[dx+2]
……
……

对于以上的计算,我们可以用类似于前缀和的后缀和优化,维护vis[cx]∗vis[dx]vis[cx]*vis[dx]vis[cx]∗vis[dx]的后缀和。

然后逆序枚举dxdxdx和cxcxcx,维护vis[ax]∗vis[bx]vis[ax]*vis[bx]vis[ax]∗vis[bx]的前缀和。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define ll long long
using namespace std;
int n, m, vis[15010], a[40010];
int cnt[15010][4];
int sum[15010];
int main()
{scanf("%d%d", &n, &m);int x;for (int i = 1; i <= m; ++i){scanf("%d", &x);a[i] = x;++vis[x];}// 正序枚举a和b for (int t = 1; t <= (n - 1) / 9; ++t){for (int k = n; k > n - t; --k) sum[k] = 0; for (int k = n - t; k >= 1; --k) sum[k] = vis[k] * vis[k+t] + sum[k+1];for (int a = 1; a + 9 * t + 1 <= n; ++a){cnt[a][0] += vis[a + 2 * t] * sum[a + 8 * t + 1];cnt[a + 2 * t][1] += vis[a] * sum[a + 8 * t + 1];} }// 倒序枚举d和cfor (int t = 1; t <= (n - 1) / 9; ++t) {for (int k = 1; k < 2 * t; ++k) sum[k] = 0;for (int k = 2 * t; k <= n; ++k) sum[k] = vis[k] * vis[k - 2 * t] + sum[k-1];for (int d = n; d - (9 * t + 1) >= 1; --d){cnt[d][3] += vis[d - t] * sum[d - 7 * t  - 1];cnt[d - t][2] += vis[d] * sum[d - 7 * t  - 1];}}for (int i = 1; i <= m; ++i){printf("%d %d %d %d\n",cnt[a[i]][0], cnt[a[i]][1], cnt[a[i]][2], cnt[a[i]][3]);}return 0;
}

NOIP2016普及组复赛 解题分析相关推荐

  1. NOIP2011普及组复赛 解题分析

    1.数字反转 算法分析 反转后需要考虑前导0.重新组数就可以规避这个问题.就是剥数和组数的过程. #include <iostream> #include <cstdio> # ...

  2. NOIP2015普及组复赛 解题分析

    1.金币 算法分析 直接模拟. #include <iostream> #include <cstdio> #include <cstring> using nam ...

  3. NOIP2016普及组复赛第一题的AC程序加题解pascal

    P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物.她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同.为了公平起 见,P老师决定只买同一种包装的铅笔.商店不允许 ...

  4. C语言普及组NOIP考试培训,NOIP 2018普及组复赛解题报告来了!

    以下解题思路及选手代码未经官方评测,仅供参考,复赛成绩以官方(CCF)评测结果为准. 主要考察字符串.参考代码: #include int main() { int ans = 0; char ch; ...

  5. NOIP2016提高组复赛解题报告

    Day1 T1-玩具谜题 Day1 T2-天天爱跑步 Day1 T3-换教室 Day2 T1-组合数问题 Day2 T2-蚯蚓 Day2 T3-愤怒的小鸟 转载于:https://www.cnblog ...

  6. NOIP2016普及组复赛第一题——买铅笔

    程序如下: var i,n,m:longint;   a:array[0..3,0..2]of longint; begin   m:=maxlongint;   readln(n);   for i ...

  7. NOIP2016普及组复赛广东省一等奖名单及排名

     省排名   准考证编码     省份      姓名      性别      分数                                   学校     年级 1 GD-0407 广东 ...

  8. 近年NOIP普及组复赛题目的简单讲解

    NOIP2015普及组复赛 整套题都出得不错,难度适中,层次分明 建议同学们在做题的时候还是先在草稿纸上分析,把关键算法的伪代码写出来,然后设计数据进行静态查错,没有问题后再到电脑上敲出代码.实际效率 ...

  9. [NOIP2016 普及组] 买铅笔

    [NOIP2016 普及组] 买铅笔 题目背景 NOIP2016 普及组 T1 题目描述 P 老师需要去商店买 nnn 支铅笔作为小朋友们参加 NOIP 的礼物.她发现商店一共有 333 种包装的铅笔 ...

  10. 洛谷——P1909 [NOIP2016 普及组] 买铅笔

    P1909 [NOIP2016 普及组] 买铅笔 题目描述 P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物.她发现商店一共有 33种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不 ...

最新文章

  1. c# winform快捷键设置
  2. 缩略图信息提取工具vinetto
  3. SAP UI5 OData binding - how does setModel work
  4. 使用python game写一个贪吃蛇游戏
  5. SpringBoot 整合 Shiro Thymeleaf Mysql 动态授权
  6. 2021年广西艺术高考成绩查询,2021年广西美术高考成绩查询网址:https://www.gxeea.cn/...
  7. java自学难点_分享在达内教育培训Java的感受
  8. air写文件 SecurityError: fileWriteResource 时报错的解决方法
  9. java解析XML大全(转)
  10. windows DNS服务器的配置
  11. rapidxml学习
  12. 计算机应用基础上海交通大学出版社双色版,计算机应用基础模块化教程
  13. win10企业版跟win10专业版有什么区别,win10系统版本区别
  14. hdu5510 Bazinga(KMP 剪枝) !!
  15. C语言打印日历总结报告,C语言打印日历
  16. Ubantu18.04上配置cuda10.0和cudnn
  17. 为什么显示服务器升级中,手机老是显示服务器升级中
  18. C++项目--汇总(无工作经验或者不到两年工作经验者)
  19. 如何:创建 MDI 父窗体、子窗体、确定活动的 MDI 子窗体
  20. 读取服务器内存信息工具,使用Sigar获取服务器内存、IP、CPU、IO、MAC地址、操作系统等信息......

热门文章

  1. 郑大第九届校赛正式赛(1819: 加加加!(油))
  2. 计算机语言 指令,计算机BASIC语言    指令
  3. 使用FlashCS6制作cocos2d-x动作脚本的思路整理
  4. android 驱动开发教程,Android驱动开发入门
  5. java 读取文件成字节数组_java读取文件为字节数组
  6. 狄拉克量子力学原理【1】态叠加原理
  7. B站晚会大火的 140 万个理由!
  8. 【教你Win7下如何激活快速启动栏】
  9. 如何让自己像打王者荣耀一样疯狂且不知疲倦地学习?
  10. solidworks新建工程图默认单位为毫米