0
点赞
收藏
分享

微信扫一扫

“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】


​​题目传送门​​

“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_数组

题解

  • 解法一:
  • 对于相邻的两个位置,假设高度分别为“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_差分_02,那么所需的操作数即为“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_差分_03
  • 对于这个结果,我们首先反应是:操作数“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_差分_04
  • 换种方式,我们可以认为是:无论右面“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_差分_05如何,当遇到“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_数组_06的时候,我们至少要保证“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_数组_06达到目的状态。那么对于“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_差分_05而言,如果“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_操作数_09,那么在对“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_数组_06操作的时候,实际上就已经帮“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_差分_05完成了操作;如果“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_操作数_12,那么此时再对“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_差分_05
  • 那么现在,我们就可以根据“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_操作数_14“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_数组_15
  • 详情见代码
  • 解法二:
  • 实际上解法一也是一种差分的思想,只不过是动态的差分。既然差分可以解决,那么我们当然可以直接计算差分数组,然后根据数组计算。
  • 每次操作可以将一个区间内的数减一。
  • 如图,通过计算出差分数组,操作可以转为先选 取一个数减一再选取一个数加一。目标的差分数 组也就变成了第一个数为1,其余为0的数组。
  • 最快操作方式就是将差分数组第一个数减为1,其余减为0。即操作数为差分数组的正数之和减一
  • “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——B.减成一【思维】【差分】_差分_16

AC-Code

#include <bits/stdc++.h>
using namespace std;

int main() {
int t; cin >> t;
while (t--) {
int n; cin >> n;
int ans = 0;
int pre = 1;
int x;
for (int i = 1; i <= n; ++i) {
cin >> x;
if (x <= pre) {
pre = x;
continue;
}
ans += x - pre;
pre = x;
}
cout << ans << endl;
}
return 0;
}

#include<bits/stdc++.h>
#define
long long f[N],a[N];
int main() {
long long t;
cin >> t;
long long num = 0;
while(t--) {
long long n;
cin >> n;
num += n;
long long sum = 0;
for(long long i = 0; i < n; ++i) {
cin >> a[i];
if(i)
f[i] = a[i] - a[i - 1];
else
f[i] = a[i];
if(f[i] > 0)
sum += f[i];
}
cout << sum - 1 << endl;
}
}


举报

相关推荐

第十届泰迪杯B题解题

0 条评论