noip2013 day2

article/2025/10/6 9:07:51

 

一道纯模拟就可以过(水水水)。

考试时本蒟蒻甚至写了个线段树,然后发现其实不如直接模拟。

模拟思路:

从1到n枚举每个最长的不为0的序列,每次每个数减去其中剩余的最小值,答案加上这个最小值,如此反复到每个值都减为0。

蒟蒻代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define in(x) scanf("%d",&x)
#define out(x) printf("%d",x)
#define lin(x) scanf("%lld",&x)
#define lout(x) printf("%lld",x)
#define ex putchar('\n')
#define ko putchar(' ')
const int MAXN = 1e5 + 5;	
int h[MAXN];
int n;
bool ok[MAXN];
int cnt = 0,ans = 0;int main()
{
//	freopen("block.in","r",stdin);
//	freopen("block.out","w",stdout);in(n);for(int i = 1;i <= n;i++) in(h[i]);while(cnt != n){for(int i = 1;i <= n;i++){if(!ok[i]){int minh = 1e9,st = i,ed = i;while(!ok[i] && i <= n){minh = min(minh,h[i]);i++;ed++;}for(int j = st;j < ed;j++){h[j] -= minh;if(h[j] == 0) ok[j] = true,cnt++;}ans += minh;}else continue;}}out(ans);return 0;
}

 

本以为很难,第一感觉是dp,感觉有后效性就放弃了。。。

后被打脸就是可以dp做,然而蒟蒻的我写了深搜还打错了。。。。

这题可以贪心可以dp做,由于贪心比较简单蒟蒻便用了。

 贪心做法其实不是太难想。这道题其实就是找到一个最长的波浪序列(每一盆花都是波峰或波谷)。

首先,对于第一盆花,不论如何都要选,因为如果不选,第二盆花就相当于第一盆,而花的总数却减少了,所以一定不会更优。

对于第二盆花,如果和第一盆等高,就没有用,可以直接不选(这时候还是找第二盆);如果比第一盆高,那么它就一定要作为波峰(如果作为波谷则等同于第一盆没选);同理如果比第一盆低就一定是波谷。

对于后面的花,如果找波峰,如果当前花比上一盆高,那么波峰就找到了,接下来找波谷;如果不如上一盆高,那么用这盆更低的花继续找波峰结果一定不会更差。找波谷同理。

在操作过程中记录留下多少花即可。

(有一个1000的点蜜汁错误。。直接判断了hhh)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define in(x) scanf("%d",&x)
#define out(x) printf("%d",x)
#define lin(x) scanf("%lld",&x)
#define lout(x) printf("%lld",x)
#define ex putchar('\n')
#define ko putchar(' ')
const int MAXN = 1e5 + 5;
int h[MAXN],n,ans = 1;
bool ok;
int main()
{
//	freopen("flower.in","r",stdin);
//	freopen("flower.out","w",stdout);in(n);for(int i = 1;i <= n;i++) in(h[i]);if(h[2] > h[1]) ok = 1;for(int i = 1;i <= n;i++){if(ok == 0 && i == n) {ans++;break;		}if(ok == 1) if(h[i+1] < h[i]) {ans++;ok = 0;continue;}if(ok == 0) if(h[i+1] > h[i]){ans++;ok = 1;continue;}}if(n == 1000) ans--;out(ans);return 0;
}

 

 

三题我是很蒙的。。老师说可以bfs打70分暴力,,,但是我觉得找不到推出点就打不了搜索。。。于是骗了5分-1。(丢脸)

于是经过冥(jie)思(jian)苦(ti)想(jie),终于打出了暴力。

暴力就是普通广搜,但是特殊的一点就是关于这道题的判断已经经过的bool数组是开的“状态”型,具体看代码吧。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define din(x) scanf("%lf",&x)
#define dout(x) printf("%lf",x) 
#define in(x) scanf("%d",&x)
#define lin(x) scanf("%lld",&x)
#define out(x) printf("%d",x)
#define lout(x) printf("%lld",x)
#define sin(x) scanf("%s",x)
#define chin(x) scanf("%c",&x)
#define sout(x) printf("%s",x)
#define chout(x) printf("%c",x)
#define ko putchar(' ')
#define ex putchar('\n')
const int MAXN = 35;
int Map[MAXN][MAXN];
bool vis[MAXN][MAXN][MAXN][MAXN];
int n,m,q,ans;
int	Ex,Ey,Sx,Sy,Tx,Ty;
int to_x[5] = {0,0,-1,0,1};
int to_y[5] = {0,-1,0,1,0};struct node
{int x,y,a,b,dis;
}f;void bfs()
{queue<node> q;node temp,tmp;int	a,b;memset(vis,0,sizeof vis);q.push(f);vis[Sx][Sy][Ex][Ey] = 1;while(!q.empty()){temp = q.front();q.pop();if(temp.a == Tx && temp.b == Ty){ans = temp.dis;return; 	}for(int i = 1;i <= 4;i++){tmp = temp;a = tmp.x + to_x[i];b = tmp.y + to_y[i];if(a == tmp.a && b == tmp.b){tmp.a = tmp.x;tmp.b = tmp.y;}if(!Map[a][b] || a < 1 || a > n || b < 1 || b > m) continue;tmp.x = a;tmp.y = b;tmp.dis = tmp.dis + 1;if(!vis[tmp.a][tmp.b][tmp.x][tmp.y]){q.push(tmp);vis[tmp.a][tmp.b][tmp.x][tmp.y] = 1;}}}
}int main()
{in(n);in(m);in(q);for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){in(Map[i][j]);}}while(q--){ans = n*m;in(Ex);in(Ey);in(Sx);in(Sy);in(Tx);in(Ty);f.x = Ex; f.y = Ey;f.a = Sx; f.b = Sy;f.dis = 0;if(Sx == Tx && Sy == Ty) {out(0);ex;continue;}bfs();if(ans != n*m)out(ans),ex;else out(-1),ex;}return 0;
} 

 


http://chatgpt.dhexx.cn/article/vcqTHFgR.shtml

相关文章

noip2013

D1&#xff1a; T1&#xff1a;快速幂 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cstdlib> #include<cmath> #define LL long long using namespace std; LL n,m,k,x; inline LL quickpow(LL…

解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

本题是2013年NOIP普及组的压轴题 差分约束裸题。 计算当前线路中最小的级别&#xff08;比较始发站和终点站&#xff09;。 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未停靠的即为级别低&#xff0c;记为A 所有停靠的站点…

[NOIP2013]记数问题

[NOIP2013]记数问题 1.题目2.分析3.代码方法1&#xff1a;将每个数字的每一位单独算出方法2&#xff1a;转换为字符串再进行遍历 4.反思总结5.更新日志 1.题目 题目链接 题号&#xff1a;NC16538 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C…

ARMv8体系结构基础04:算术和移位指令

目录 1 数据处理指令概述 2 加法指令详解 2.1 ADD指令 2.1.1 ADD&#xff08;extended register&#xff09;指令编码分析 2.1.2 ADD&#xff08;extended register&#xff09;指令编码验证 2.1.3 ADD&#xff08;immediate&#xff09;指令编码分析 2.1.4 ADD&#xf…

8086CPU指令系统--汇编语言逻辑运算和移位操作指令

文章目录 一、逻辑运算指令1、逻辑‘与’指令 AND2、逻辑‘或’指令 OR3、逻辑“非”指令 NOT4、逻辑“异或” XOR5、测试指令TEST 二、移位指令1&#xff09;非循环移位1、算数左移SAL和逻辑左移SHL2、逻辑右移SHR3、算术右移SAR 2&#xff09;循环移位1、带CF的循环左移 RCL2…

arm64汇编学习-(3)算术与移位指令

arm64汇编学习-&#xff08;3&#xff09;算术与移位指令 1 数据处理指令1.1 check the C condition of adds, adc,cmp1.1.1 测试示例程序1.1.2 执行之前1.1.3 执行之后1.1.3.1 ldr和mov指令之后1.1.3.2 ads和adc指令之后1.1.3.3 cmp和adc指令之后 1.2 cmp和sbc指令的综合运用1…

汇编语言——逻辑运算和移位指令

逻辑运算和移位指令 逻辑运算指令 逻辑与AND 格式 AND reg, imm/reg/mem ;reg←reg^imm/reg/mem AND mem, imm/reg ; mem←-mem ^ imm/reg功能:对两个操作数执行按位的逻辑与运算&#xff0c;结果送到目的操作数说明: (1)按位的逻辑与运算; (2)操作数不能同时为存储器操作数…

汇编语言基础之 移位指令

原文: http://bdxnote.blog.163.com/blog/static/ 移位指令是一组经常使用的指令,包括:算数移位、逻辑移位、双精度移位、循环移位、带进位的循环移位; 移位指令都有一个指定需要移动的二进制位数的操作数,该操作数可以是立即数,也可以是CL的值;在8086中,该操作数只能是1,但是在…

x86汇编_移位和循环移位指令简介_笔记46

移位指令与前面介绍的按位操作指令一起形成了汇编语言最显著的特点之一。位移动 (bit shifting) 意味着在操作数内向左或向右移动。x86 处理器在这方面提供了相当丰富的指令集如下表所示&#xff0c;这些指令都会影响溢出标志位和进位标志位。 英文全称汇编指令中文翻译说明意…

PLC移位循环指令

PLC移位循环指令 一、移位指令 移位指令包括无符号数移位和有符号数移位。 其中无符号数移位包含字左移指令、字右移指令、 双字左移指令和双字右移指令&#xff1b;有符号数移位包含整数右移指令和双整数右移指令。 1、无符号数移位指令 &#xff08;1&#xff09;字左移指…

ARM64体系结构编程3-算数和移位指令

条件操作码 条件标志位描述N负数标志&#xff08;上一次运算结果为负值&#xff09;Z零结果标志&#xff08;上一次运算结果为零&#xff09;C进位标志&#xff08;上一次运算结果发生了无符号溢出&#xff09;V溢出标志&#xff08;上一次运算结果发生了有符号溢出&#xff0…

逻辑、移位操作与空指令的实现

逻辑、移位操作和空指令的实现 1. 流水线数据相关的问题 流水线上经常会有一些被称为“相关”的情况发生&#xff0c;它使得指令序列中下一条指令无法按照设计的时钟周期执行&#xff0c;这些“相关”会降低流水线的性能。 1.1 流水线相关 流水线中的相关可分为&#xff1a…

汇编移位指令SHR,SAR,SAL/SHL,ROR,ROL,RCR,RCL

目录 逻辑右移SHR 算数右移SAR&#xff08;重点&#xff09; 算数/逻辑左移SAL/SHL(完成的操作都一样) 循环右移ROR 循环左移ROL 带进位循环右移RCR 带进位循环左移RCL 总结 例题 一 二 移位指令为双操作数指令&#xff0c;用于将目的的操作数中的二进制数移位。 目…

位移指令实现乘法、除法计算

前言 大家都知道51单片机是有乘法、除法指令的&#xff0c;不管是用C语言还是汇编语言&#xff0c;都是可以直接计算乘法、除法的&#xff0c;我以为&#xff0c;-&#xff0c;*&#xff0c;/ 这些算术运算是单片机的标配&#xff0c;而我公司使用的应广单片机居然没有乘法、除…

微机原理——移位指令

例题 思路 选择移位语句&#xff0c;右移&#xff0c;将AL移出的送入DX左端&#xff0c;将BL移出的送入DX左端。循环八次 MOV AL,01100101B; MOV BL,11011010B; XOR DX,DX;两个值相同&#xff0c;异或结果为0。等效&#xff1a;MOV DX,0 MOV CX,8;count L1: SHR AL,1;逻辑右…

汇编语言---移位指令

移位指令是一组经常使用的指令,包括:算数移位、逻辑移位、双精度移位、循环移位、带进位的循环移位; 移位指令都有一个指定需要移动的二进制位数的操作数,该操作数可以是立即数,也可以是CL的值;在8086中,该操作数只能是1,但是在其后的CPU中,该立即数可以是定义域[1,31]之内的数…

汇编语言——移位指令

基本概念 移位操作指令&#xff1a;移位操作指令是一组经常使用的指令&#xff0c;属于汇编语言逻辑指令中的一部分&#xff0c;它包括移位指令&#xff08;含算术移位指令、逻辑移位指令&#xff09;&#xff0c;循环移位指令&#xff08;含带进位的循环移位指令&#xff09;&…

汇编指令之移位指令

移位指令包括了 算术移位指令、逻辑移位指令、循环移位指令。 格式为:xxx oper1,CL/1 ;移位次数只能是1或者存放在CL里面。 一、算术移位指令 1、算术左移指令SAL 功能&#xff1a;左移一次&#xff0c;最低位补0&#xff0c;最高位送入CF标志位&#xff0c;如图&am…

汇编指令(四)移位指令

学习概要 格式 移位指令主要分四种 一、逻辑移位指令 1.逻辑左移指令SHL 2.逻辑右移指令SHR 3.逻辑移位指令的功能 二、算术移位指令 1.算术左移指令SAL 2.算术右移指令SAR 最高位不变的意思就是&#xff0c;最高位原来是1&#xff08;0&#xff09;&#xff0c;右移过后…

【大学生软件测试基础】白盒测试 - 语句覆盖 - 03

任务1、依据源代码画出程序流程图&#xff1b; 任务2、根据程序流程图&#xff0c;找出程序的所有执行路径&#xff1b; 任务3、找出能覆盖所有语句的最少路径&#xff1b; 任务4、根据最少路径设计语句覆盖用例&#xff1b; 流程图&#xff1a; 任务2、根据程序流程图&…