以我现在的水平最多只能做两个div 2 的题,现在就是要将两个题做稳固,慢慢的向第三个题发展,如果div 2做出两个我们就先不补题 , 所以一般我现在就只会补两个题,技术还在慢慢加强。
第一题
题意:这个题目的意思是总共有三扇门,每扇门的后面都会有一把钥匙,这把钥匙对应的编号就是可以开哪扇门,所以这题很简单一般都会,只要进去两次就可以把三扇门给打开。
输入
第一行 : 一共有 t 个数据;
第二行 : 每次给你一把门的钥匙;
第三行: 给你每扇门后面的钥匙编号;
#include <iostream>
using namespace std;
const int N = 10010;
int a[N];
int main()
{
int t;
cin >> t;
while(t --)
{ int flag = 0;
int n;
cin >> n;
for(int i = 1; i <= 3 ; i ++) cin >> a[i];
if(a[n])
{
if(a[a[n]])
{
flag = 1;
}
}
if(flag == 1) cout << "YES"<<endl;
else cout <<"NO"<<endl;
}
return 0;
}
这一题比较简单,所以就按照原本思想就好了。
第二题
题意:这个题的意思有一段区间,你可以在这个区间上的任意两个端点来飞,但是如果上一个点比下一个点大的话,就是要承受 坠落的伤害 。
题解:这个题目很明显就是用前缀和来解题,只有当前面大于后面才会受到伤害,根据题目的意思我们不仅仅要从前面往后面求前缀和还要从后面往前面求前缀和,再判断这给定我们要求的区间是从哪边到哪边来求解。
输入
第一行 :给定 n(数组的元素个数) 和 m (询问个数)
第二行:数组元素的值
剩下m行:就是 m 组询问
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
LL a[N],s[N],t[N];
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1; i <= n ; i ++) cin >> a[i];
for(int i = 2; i <= n ; i ++)
{
if(a[i - 1] > a[ i]) s[i] = s[i -1] + a[i - 1] -a[i];
else s[i] = s[i - 1];
}
for(int i = n - 1 ; i >= 1 ; i --)
{
if(a[i + 1] > a[i]) t[i] = t[i + 1] + a[i + 1] - a[i];
else t[i] = t[i + 1];
}
for(int i = 1 ; i <= m ; i ++)
{
int a,b;
cin >> a >> b;
if(a < b) cout << s[b] - s[a]<<endl;
else cout << t[b] - t[a] <<endl;
}
return 0;
}
这个题目的下标有点容易犯错误,所以可以尝试 debug , 哈哈哈
加油 ....