题目描述
乌龟家的屋顶是凹凸不平的,所以每次雨后都会积水。为了知道屋顶是否会在暴雨后塌掉,他把屋顶的形 状给了你,希望你帮他计算暴雨后屋顶的积水总量。
乌龟的屋顶由顺次排在同一水平线上的 𝑛n 个宽度为 11、高度为整数 (分别给出) 的瓦片组成。例如给定 𝑛=5n=5 ,瓦片的高度分别为 4,2,3,5,14,2,3,5,1 ,屋顶可以画在下图所示的网格中,灰色格子为瓦片。
暴雨过后,如果一个方格向左右两侧延伸都能到达瓦片占据的方格,它就会积水。所以图中波浪线格子在暴雨后会积水,屋顶的积水方格总数为 33 。
输入
两个整数 𝑛n, 𝑅1R1,表示屋顶的宽度和生成数列的首项。从左向右数第 𝑖i ( 1≤𝑖≤𝑛1≤i≤n )个瓦片的高度 𝑎𝑖=𝑅𝑖mod10ai=Rimod10 。
试题中使用的生成数列 𝑅R 定义如下:整数 0≤𝑅1<2017010≤R1<201701 在输入中给出。对于 𝑖>1i>1,𝑅𝑖=(𝑅Ri=(R𝑖−1i−1×6807+2831)mod201701×6807+2831)mod201701。
输出
一个整数,表示暴雨后屋顶积水方格的总数。
样例
输入
复制
10 1
输出
复制
23
说明
数据规模
1≤𝑛≤1001≤n≤100
代码如下
#include <bits/stdc++.h>
using namespace std;
int h[105];
int main(){
int n,R;
cin>>n>>R;
h[1] = R%10;
int maxH = h[1];
int maxIdx = 1;
int tileSum = h[1];
for(int i=2;i<=n;i++){
R = (R * 6807 + 2831) % 201701;
h[i] = R%10;
tileSum += h[i];
if(h[i]>=maxH){
maxH = h[i];
maxIdx = i;
}
}
int barrier = h[1];
int sum = maxH - h[1]; // 溜掉的水
for(int i=2;i<maxIdx;i++){
if(h[i]>barrier){
barrier = h[i];
}
sum += maxH-barrier; // 加上本列漏掉的水
}
barrier = h[n];
sum += maxH-h[n];
for(int i=n-1;i>maxIdx; i--){
if(h[i]>barrier){
barrier = h[i];
}
sum += maxH-barrier; // 加上本列漏掉的水
}
cout << n*maxH - tileSum - sum;
return 0;
}