NOIP2011提高组 DAY2 题解&总结

2023-11-13

考试时的心态:


  这次离线赛考的是NOIP2011,考得比较差,其实试卷比较水,水出新高度了。但是就考了160分,还是因为大意了,说实话,我一直在想第二题那个Sigma 是怎么计算的,很虚。虽然最后证明我的想法是正确的,但是由于这道题花的时间太少了,导致我WA了。就30分……
  第三题玄学贪心水了30分,还是比较好的,就是第二题可惜了。

题解:

第一题:计算系数


  这道题是道水题,纯属送分,只要把杨辉三角计算出来,再使用快速幂,处理出系数就可以了。不多解释。
  附上AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define M 1050
#define FOR(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;++i)
#define DOR(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;--i)
using namespace std;
const int P=10007;
const int S=20;
//ÎļþÃû Êä³öµ÷ÊÔ cstdio long long 1LL
int a,b,k,m,n;
int dp[M][M];//¼ÆËãÑî»ÔÈý½Ç
struct water {
    void solve() {
        dp[1][1]=1;
        FOR(i,2,k+1) {
            FOR(j,1,i) {
                dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%P;
            }
        }
        cout<<dp[k+1][m+1]<<endl;
    }
} p50;
struct _pAC {
    int fast(int a,int b) {
        int res=1;
        int x=a;
        while(b) {
            if(b&1) {
                res=(res*x)%P;
            }
            b/=2;
            x=(x*x)%P;
        }
        return res;
    }
    void solve() {
        dp[1][1]=1;
        if(!(a||b||k||n||m)) {
            puts("0");
            exit(0);
        }
        FOR(i,2,k+1) {
            FOR(j,1,i) {
                dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%P;
            }
        }
        long long ans;
        ans=(1LL*(fast(a,n)*fast(b,m))%P*dp[k+1][m+1])%P;
        cout<<ans<<endl;
    }
} pAC;
int main() {
    cin>>a>>b>>k>>n>>m;
    pAC.solve();
    return 0;
}

第二题:智障质检员:


  这道题显然可以用二分法来写,要注意的是S属于[1,1e12],因此要用long long 来存储。除此之外就是对W进行二分查找了。
  至于为什么用二分法,我们不难看出,当W变小时,满足条件的j会变多,Y自然会变大,因此Y与W的关系是单调的。
  之后就是对这个Sigma的处理了。
  这个问题也是比较好处理的。我们只需要用前缀和优化一下就好了。
  先预处理出1到i区间中的满足条件的j的数量cnt[i],同时记录满足条件的价值和val[i]。
  对于每一个区间[L,R]只需要计算出(cnt[B[i].R]-cnt[B[i].L-1])*(val[B[i].R]-val[B[i].L-1])即可。
  附上AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define ll long long
#define M 200050
#define FOR(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;++i)
#define DOR(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;--i)
using namespace std;
int n,m;
ll stan;
struct Stone {
    int value,weight;
} A[M];
struct node {
    int L,R;
} B[M];
ll cnt[M];
ll val[M];
long long res;
long long check(int mid){
    cnt[0]=val[0]=0;
    FOR(i,1,n){
        cnt[i]=cnt[i-1];
        val[i]=val[i-1];
        if(A[i].weight>=mid) {
            cnt[i]++;
            val[i]+=A[i].value;
        }
    }
    res=0;
    FOR(i,1,m)res+=1LL*(cnt[B[i].R]-cnt[B[i].L-1])*(val[B[i].R]-val[B[i].L-1]);
    return res;
}
int main() {
    cin>>n>>m>>stan;
    int R=0,L=2e9;
    FOR(i,1,n)scanf("%d%d",&A[i].weight,&A[i].value),R=max(R,A[i].weight),L=min(L,A[i].weight);
    FOR(i,1,m)scanf("%d%d",&B[i].L,&B[i].R);
    int l=0,r=R;
    long long ans=2e14;
    while(l<=r) {
        int mid=(l+r)>>1;
        ll y=check(mid);
        ans=min(ans,abs(y-stan));
        if(y<stan)r=mid-1;
        else l=mid+1;
    }
    cout<<ans<<endl;
    return 0;
}

第三题:观光公交:


  这道题是一道贪心题。它的基本决策如下:每一次我们肯定会选择车上人数最多的一条道路使用加速器。但是,如果有人迟到了,那么用了跟没用一样。因此我们就要在没有人会迟到,使用人数最多的那条道路上使用加速器。
  因此我们的贪心决策就很明显了。接下来就是复杂度的问题。
  我们可以看到如果我们对于每一个k都扫一遍进行决策的话,显然要用前缀和进行优化。而倒着使用前缀和显然会给我们的运算带来许多方便。对于这道题,由于我们进行的仅仅是判断与加减语句,复杂度常数非常小。因此O(n*k)的复杂度显然是能过的(虽然有一亿……)。
  附上AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ShimaKZ 404 Not Found
#define M 100086
#define max sdjkl
#define min sdjll
#define FOR(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;++i)
#define DOR(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;--i)
using namespace std;
int n,m,k;
int dis[M];
int leave[M];
int arrive[M];
int sum[M];
int down[M];
int ans=0;
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline void checkmax(int &a,int b){if(b>a)a=b;}
inline void checkmin(int &a,int b){if(b<a)a=b;}
int main(){
    cin>>n>>m>>k;
    FOR(i,1,n-1)scanf("%d",&dis[i]);
    FOR(i,1,m){
        int t,a,b;
        scanf("%d%d%d",&t,&a,&b);
        checkmax(leave[a],t);
        ans-=t;
        down[b]++;
    }
    while(k--){
        FOR(i,1,n)arrive[i]=max(arrive[i-1],leave[i-1])+dis[i-1];
        int now=0;
        DOR(i,n,2){
            if(!dis[i-1])sum[i-1]=0;
            else{
                sum[i-1]=down[i];
                if(arrive[i]>leave[i])sum[i-1]+=sum[i];
            }
        }
        int id=0,max=0;
        FOR(i,1,n-1){
            if(sum[i]>max){
                max=sum[i];
                id=i;
            }
        }
        dis[id]--;
    }
    FOR(i,1,n)arrive[i]=max(arrive[i-1],leave[i-1])+dis[i-1];
    FOR(i,1,n)ans+=arrive[i]*down[i];
    cout<<ans<<endl;
    return 0;
}

总结:


  这次考试考得很迷……有很多不该错的地方犯了一些错误。其实第二题我完全没有必要进行对拍,你说前缀和优化和直接循环在结果上有什么区别呢?因此对于一些显然对的算法,就没有必要进行对拍了。对拍反而是徒劳。因此在这种情况下,不如多去考虑一下二分的边界以及自己的代码有没有什么漏洞,能不能用一些数据来进行hack。没有考出应有的水平,这是比不会写要伤很多的情况。下次要避免啊。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NOIP2011提高组 DAY2 题解&总结 的相关文章

  • Huffman-哈夫曼编码算法详解

    1 概述 背景 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法 其压缩率通常在20 90 之间 哈夫曼编码算法用字符在文件中出现的频率表来建立一 个用0 1串表示各字符的最优表示方式 给出现频率高的字符较短的编码 出现频率较低的字符
  • 【刷题篇】贪心算法(一)

    文章目录 分割平衡字符串 买卖股票的最佳时机 跳跃游戏 钱币找零 分割平衡字符串 class Solution public int balancedStringSplit string s int len s size int cnt 0
  • 动态规划or贪心算法--剪绳子/切割杆

    需求一 剪绳子 将长度为n的绳子剪成若干段 求各段长度乘积的最大值 分析 1 动态规划 设f n 代表长度为n的绳子剪成若干段的最大乘积 如果第一刀下去 第一段长度是i 那么剩下的就需要剪n i 那么f n max f i f n i 而f
  • 贪心算法初步

    一 什么是贪心算法 贪心算法的定义 贪心算法是指在对问题求解时 总是做出在当前看来是最好的选择 也就是说 不从整体最优上加以考虑 只做出在某种意义上的局部最优解 贪心算法不是对所有问题都能得到整体最优解 关键在于贪心策略的选择 选择的贪心策
  • 代码随想录 - Day37 - 贪心算法

    代码随想录 Day37 贪心算法 376 摆动序列 排除只有一个数的情况 把差值全部求出来放到dif里 在此过程中顺便去掉差值为0的情况 如果dif为空 说明里面所有差值为0 那么最长摆动序列只能是1 直接返回 如果dif不为空 把dif
  • 贪心算法 - java切金条问题 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 今天康康一个贪心算法的经典例题 切金条问题 问题 一块金条切成两半 是需要花费和长度数值一样的铜板的 比如长度为20的金条 不管切成长度多大的两半 都要花费20个铜板
  • 刷题之455. 分发饼干 -----贪心初试

    假设你是一位很棒的家长 想要给你的孩子们一些小饼干 但是 每个孩子最多只能给一块饼干 对每个孩子 i 都有一个胃口值 g i 这是能让孩子们满足胃口的饼干的最小尺寸 并且每块饼干 j 都有一个尺寸 s j 如果 s j gt g i 我们可
  • 力扣45.跳跃游戏II 动态规划与贪心两种解法

    问题 给定一个长度为 n 的 0 索引整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 换句话说 如果你在 nums i 处 你可以跳转到任意 nums i j 处 0 lt j lt
  • 《面试准备》c/c++贪心算法实例

    贪心算法问题1 西红柿首富的烦恼 王多鱼获得了一笔的奖金X 要求购买最少的商品把钱花光 即没有零钱剩下 否则奖金会被没收 输入 一个整数k 商品的种类 每个种类商品个数不限 第i类商品的价值a i 一个整数m 奖金总额 输出 最少商品数量
  • 【洛谷 P1115】最大子段和 题解(贪心算法)

    最大子段和 题目描述 给出一个长度为 n n n 的序列 a a a 选出其中连续且非空的一段使得这段和最大 输入格式 第一行是一个整数 表示序列的长度 n
  • week4作业题_A-DDL的恐惧

    A DDL的恐惧 题目描述 ZJM 有 n 个作业 每个作业都有自己的 DDL 如果 ZJM 没有在 DDL 前做完这个作业 那么老师会扣掉这个作业的全部平时分 所以 ZJM 想知道如何安排做作业的顺序 才能尽可能少扣一点分 请你帮帮他吧
  • 汽车加油问题【贪心算法】

    1 原版 Problem Description 一辆汽车加满油后可行驶n公里 旅途中有若干个加油站 设计一个有效算法 指出应在哪些加油站停靠加油 使沿途加油次数最少 并证明算法能产生一个最优解 对于给定的n和k个加油站位置 计算最少加油次
  • LeetCode第45题解析

    给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 你的目标是使用最少的跳跃次数到达数组的最后一个位置 示例 输入 2 3 1 1 4 输出 2 解释 跳到最后一个位置的最小跳跃数是 2 从下
  • 动态规划算法(2)最长回文子串详解

    文章目录 最长回文字串 动态规划 代码示例 前篇 1 初识动态规划 最长回文字串 传送门 https leetcode cn problems longest palindromic substring description 给你一个字符
  • day32 贪心

    122 买卖股票的最佳时机II 每天都有着卖出和不卖出两种状态 dp解决 55 跳跃游戏 贪心找到最大的覆盖范围 每次都看覆盖范围是否超过了总范围 超过即可 45 跳跃游戏II 贪心找到最大的覆盖范围 和 最小步数 package algo
  • 4-2 背包问题(贪心)

    4 2 背包问题 贪心 与0 1背包问题类似 所不同的只是在选择物品i装入背包时 可以选择物品的一部分而不一定要全部 1 i n 用贪心算法解背包问题的基本步骤是 首先计算每种物品单位重量的价值vi wi 然后 依贪心选择策略 将尽可能多的
  • 【贪心算法】阿里巴巴与四十大盗——背包问题与0-1背包问题

    前言 关于贪心算法 我在这篇博客中已经做了简单的介绍 初识贪心算法 下面来介绍一下贪心算法中的一个经典的问题 背包问题 一 问题描述 一天 阿里巴巴赶着一头毛驴上山砍柴 无意间在远处发现了一群盗贼 他们把偷窃强盗来的宝物全部藏在一个山洞里
  • 蓝桥杯备赛:贪心

    例题1 最少砝码 问题描述 你有一架天平 现在你要设计一套砝码 使得利用这些砝码可以称出任意 小于等于 NN 的正整数重量 那么这套砝码最少需要包含多少个砝码 注意砝码可以放在天平两边 输入格式 输入包含一个正整数 N 输出格式 输出一个整
  • 算法设计与实现--贪心篇

    贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法 以期望能够通过一系列局部最优的选择达到全局最优 贪心算法的关键是定义好局部最优的选择 并且不回退 即一旦做出了选择 就不能撤销 一般来说 贪心算法适用于满足以下两个条件的
  • 【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大

    涉及知识点 双指针 C 算法 前缀和 前缀乘积 前缀异或的原理 源码及测试用例 包括课程视频 贪心算法 题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 你可以对数组执行 至多 k 次操作 从数组中选择一个下标 i 将 n

随机推荐

  • MySQL(DDL)

    1 了解主流的数据库和数据库分类 1 1数据库概念 数据库 按照数据结构来组织 存储和管理数据的一种建立在计算机存储设备上的仓库 数据库的优势 1 可以持久化存储大量的数据 方便我们进行检索 2 可以保证数据的安全和数据的一致性 事物 3
  • printk的使用

    参考文章 https blog csdn net wwwlyj123321 article details 88422640 https blog csdn net m0 46170433 article details 105263694
  • FTP-----局域网内部远程桌面

    此文包含详细的图文教程 有疑问评论区留言 博主第一时间解决 目录 一 被远程桌面的电脑 1 开启远程权限 2 添加账户 有本地账户跳过这步 3 帐号隶属于 远程桌面 4 帐号隶属于 本地用户组 二 本地电脑连接远程桌面 前提条件 1 两台电
  • buffer_head数据结构

    内核版本 5 9 0 数据结构 Historically a buffer head was used to map a single block within a page and of course as the unit of I O
  • Spring boot new对象,通过上下文实例化对象

    import org springframework beans BeansException import org springframework beans factory NoSuchBeanDefinitionException i
  • 类的设计与实现 设计一个游戏的某个简单过程

    大作业1 类的设计与实现 一 实验目的 掌握类的设计与实现 了解如何根据描述发现类及其成员 具备初步的面向对象分析与设计能力 二 实验内容 请选择一个你所熟悉的游戏 分析其中的某个场景所涉及的类 及其各个类的属性和行为 完成类的定义 请选择
  • Java基础学习之函数式编程Predicate接口(JDK8)

    前言 今天继续来学习函数式编程接口之Predicate接口 1 上源码 package javax persistence criteria import java util List public interface Predicate
  • MyEclipse 服务器Tomcat v8.5无法在45秒内启动

    目录 前言 一 问题描述 二 解决方案 1 图形界面修改 2 配置文件修改 总结 前言 大家在使用 MyEclipse 开发时有遇到过 Tomcat 无法在45秒内启动的问题吗 一 问题描述 由于工作需要 要在 myeclipse 中使用
  • 认知科学和认知神经科学_认知增强的时代到了

    认知科学和认知神经科学 Ever since humans fell out of trees we ve been creating tools to help us survive One of the most important o
  • 浅谈JavaScript如何运行中断或停止

    在js运行过程中 在某些情况下想中断程序的运行 在网上查过 没有找到有这样的函数 一般情况下 大多数都是用return代替的 因为js脚本很多都是基于函数的运行 return的作用是中断函数的执行 提前退出该函数 所以在执行某个函数内部的时
  • Golang学习 - sync 包

    临时对象池 Pool 用于存储临时对象 它将使用完毕的对象存入对象池中 在需要的时候取出来重复使用 目的是为了避免重复创建相同的对象造成 GC 负担过重 其中存放的临时对象随时可能被 GC 回收掉 如果该对象不再被其它变量引用 从 Pool
  • Pycharm怎么去查找替换?Pycharm查找替换快捷方法是什么

    在使用python编辑器pycharm编写代码时 有时候需要去查找一些指定的代码或者是文件进行修改 但是一个个去翻太繁琐了 那这篇文章就来教大家怎么在pycharm中去实现快捷方便的查找替换方法 一起看看吧 1 当前文件 如果要在当前文件内
  • nginx 配置监听多个端口有什么问题

    Nginx 可以通过配置文件监听多个端口 在配置文件中使用 listen 指令来设置监听端口 在多个 listen 指令中使用不同的端口号即可实现监听多个端口 这种方式可以让 Nginx 同时支持 HTTP 和 HTTPS 协议 在配置多个
  • @WebServlet

    一 Servlet简介 Java Servlet 是运行在 Web 服务器或应用服务器上的程序 它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 B S开发的基础 Servlet
  • C++中Vector实现,一维转二维,再将二维数组作为元素进行保存(vector、显式实例化)

    在实际工作中 我们可能需要将类似 vector pt1 2 1 2 2 2 3 2 4 2 5 结构的一维数组 转换为类似 vectorptVec 2 1 2 2 2 3 2 4 2 5 的二维数组 内的值分别代表x y坐标值 这样还不算完
  • Linux中docker常用命令大全

    一 docker命令 docker启动与关闭 启动docker systemctl start docker 关闭docker systemctl stop docker 重启docker systemctl restart docker
  • shell第3次练习

    要求 1 ping主机测试 2 判断一个用户是否存在 3 判断当前内核主版本是否为3 且次版本是否大于10 4 判断vsftpd软件包是否安装 如果没有则自动安装 5 判断httpd是否运行 6 判断指定的主机是否能ping通 必须使用 1
  • 基于WSL2的ubuntu(Windows 子系统)安装及开发环境搭建

    WSL 是 Windows Subsystem for Linux 的缩写 译为适用于Linux 的 windows 子系统 使用WSL让开发人员按原样运行 GNU Linux 环境 包括大多数命令行工具 实用工具和应用程序 且不会产生传统
  • python anaconda安装与使用

    安装 anaconda 下载 Anaconda Anaconda Distribution 打开 Anaconda Prompt 控制台 创建一个管理环境 conda create n pytorch python 3 6 conda 是指
  • NOIP2011提高组 DAY2 题解&总结

    考试时的心态 这次离线赛考的是NOIP2011 考得比较差 其实试卷比较水 水出新高度了 但是就考了160分 还是因为大意了 说实话 我一直在想第二题那个Sigma 是怎么计算的 很虚 虽然最后证明我的想法是正确的 但是由于这道题花的时间太