2018.12.22【NOIP提高组】模拟B组

2024-02-11 05:48
文章标签 模拟 22 提高 noip 2018.12

本文主要是介绍2018.12.22【NOIP提高组】模拟B组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解题报告

  • JZOJ 2700 数字
    • 题目
    • 分析
    • 代码
  • JZOJ 3511 cza的蛋糕
    • 题目
    • 分析
    • 代码
  • JZOJ 3519 灵能矩阵
    • 题目
    • 分析
    • 代码
  • 后续

JZOJ 2700 数字

题目

设 S ( n ) 为 各 位 数 字 之 和 , 且 当 n > 9 时 , S ( n ) = S ( S ( n ) ) 设S(n)为各位数字之和,且当n>9时,S(n)=S(S(n)) S(n)n>9,S(n)=S(S(n))
如果一个数 x x x合法当且仅当 x = y × S ( y ) x=y\times S(y) x=y×S(y)
问在 [ L … R ] [L\dots R] [LR]中合法的数


分析

First of all,S(n)=(n-1) mod 9+1
这个答案可以用前缀和的方式运用 [ 1 … R ] − [ 1 … L − 1 ] [1\dots R]-[1\dots L-1] [1R][1L1]表达
那么S(n)只能是 1 ∼ 9 1\sim 9 19的范围内,所以说可以枚举 S ( n ) S(n) S(n),就可以得到对于 i i i,答案为 ⌊ n − i × i 9 × i ⌋ + 1 \lfloor\frac{n-i\times i}{9\times i}\rfloor+1 9×ini×i+1,那问题是重复呢,根据一系列的打表发现,和 i i i重复的只有 9 − i 9-i 9i,所以说根据dalao给出来的answer可以知道每 g c d ( i , 9 − i ) gcd(i,9-i) gcd(i,9i)个会重复一次,所以说代码如下


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
typedef long long ll;
inline ll iut(){rr ll ans=0; rr char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
inline void print(ll ans){if (ans>9) print(ans/10);putchar(ans%10+48);
}
signed main(){for (rr int t=iut();t;--t){rr ll l=iut(),r=iut(),sum=0;for (rr int p=1;p<10;++p)if (r>=p*p){rr ll ans=(r-p*p)/(9*p)+1;sum+=ans;if (p<5&&(9-p)*(9-p)<=r)sum-=ans/(p==3?2:9-p);}else break;for (rr int p=1;p<10;++p)if (l>p*p){rr ll ans=(l-1-p*p)/(9*p)+1;sum-=ans;if (p<5&&(9-p)*(9-p)<l)sum+=ans/(p==3?2:9-p);}else break;print(sum); putchar(10);}return 0;
}

JZOJ 3511 cza的蛋糕

题目

用最少的 1 × 2 1\times 2 1×2 2 × 1 2\times 1 2×1的长方形填充 n × m n\times m n×m的矩阵,且不存在任意位置可填充(不可重叠)


分析

由于 m m m比较小,所以说可以使用状态压缩,设 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]表示第 i i i行状态为 j j j下一行状态为 k k k的最小值,那么 d p [ i ] [ j ] [ k ] = m i n ( d p [ i − 1 ] [ y ] [ z ] + c n t ) ( 从 第 一 行 转 移 ) dp[i][j][k]=min(dp[i-1][y][z]+cnt)(从第一行转移) dp[i][j][k]=min(dp[i1][y][z]+cnt)
时间复杂度应该是 O ( n 2 2 2 × m ) O(n^22^{2\times m}) O(n222×m)


代码

#include <cstdio>
#include <cstring>
#define rr register
using namespace std;
struct rec{bool flag; int last,curr;}now;
int dp[2][131][131],a[72],n,m,ans=707406378;
inline void min(int &a,int b){if (a>b) a=b;}
inline void dfs(int dep,int noww,int nexx,int cnt){if (dep&&!(now.last&(1<<dep-1))&&!(noww&(1<<dep-1))) return;//如果还能两行之间填if (dep>1&&!(noww&(1<<dep-1))&&!(noww&(1<<dep-2))) return;//如果同一行之间还能填if (dep==m){min(dp[now.flag][noww][nexx],dp[now.flag^1][now.last][now.curr]+cnt);return;} dfs(dep+1,noww,nexx,cnt);if (!(noww&(1<<dep))&&!(nexx&(1<<dep)))dfs(dep+1,noww|(1<<dep),nexx|(1<<dep),cnt+1);//填两行之间的同一列if (!(noww&(1<<dep))&&!(noww&(1<<dep+1))&&dep<m-1)dfs(dep+2,noww|(1<<dep)|(1<<dep+1),nexx,cnt+1);//填同一行
}
signed main(){freopen("cake.in","r",stdin);freopen("cake.out","w",stdout);scanf("%d%d",&n,&m);for (rr int i=1;i<=n;++i){rr char c=getchar();while (c!='.'&&c!='*') c=getchar();a[i]=(c=='*');for (rr int j=1;j<m;++j)a[i]|=((c=getchar())=='*')<<j;}memset(dp[0],127/3,sizeof(dp[0]));dp[0][(1<<m)-1][a[1]]=0;for (rr int i=1;i<=n;++i){memset(dp[i&1],127/3,sizeof(dp[i&1]));for (rr int j=0;j<(1<<m);++j)for (rr int k=0;k<(1<<m);++k)if (dp[i&1^1][j][k]!=707406378)now=(rec){i&1,j,k},dfs(0,k,a[i+1],0);}for (rr int i=0;i<(1<<m);++i) min(ans,dp[n&1][i][0]);return !printf("%d",ans);
}

JZOJ 3519 灵能矩阵

题目

在一棵根是1的树上减少一些点权(最多减到0),问最少共减少多少点权能使所有父节点的子节点相等


分析

那么最多留下的就是子节点的最小值乘子节点个数,但是这样还是有风险的,因为这样儿子的儿子可能无法得到平均的值,所以这个x必须是所有儿子x的lcm的倍数,这样保证最小而且合法,所以说 a n s = s u m ( 原 来 的 节 点 权 值 和 ) − m i n × s o n − m i n × s o n ans=sum(原来的节点权值和)-min\times son- min \times son ans=sum()min×sonmin×son mod l c m { s o n ( x ) } lcm\{son(x)\} lcm{son(x)}


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
typedef long long ll; ll ans;
struct node{int y,next;}e[100001];
int n,a[100001],ls[100001];
inline ll iut(){rr ll ans=0; rr char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c-48),c=getchar();return ans;
}
inline ll gcd(ll a,ll b){//根据实时研究,递归gcd比非递归gcd要慢rr ll r=a%b;while (r){a=b;b=r;r=a%b;}return b;
}
inline pair<ll,ll> dp(int x){rr ll lcmm=1,minx=1e18,sum=0,t; rr int son=0;if (a[x]) return make_pair(a[x],lcmm);for (rr int i=ls[x];i;i=e[i].next){rr pair<ll,ll>tt=dp(e[i].y);lcmm*=tt.second/gcd(lcmm,tt.second);minx=minx<tt.first?minx:tt.first;sum+=tt.first; ++son;}lcmm*=son; t=minx*son-minx*son%lcmm;ans+=sum-t; return make_pair(t,lcmm);
}
signed main(){freopen("pylon.in","r",stdin);freopen("pylon.out","w",stdout);n=iut();for (rr int i=1;i<=n;++i) a[i]=iut();for (rr int i=1;i<n;++i){rr int x=iut(),y=iut();e[i+1]=(node){y,ls[x]}; ls[x]=i+1;}dp(1);printf("%lld",ans);return 0;
}

后续

再接再厉

这篇关于2018.12.22【NOIP提高组】模拟B组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698980

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代