这题,哎少写了=号贼难受。
题目描述:
小新是一名学生,最近妈妈给他送了一款小霸王游戏机,他非常的开心,里面有一款游戏他非常的喜爱。游戏中,一个模型会在一条隧道中向前运动,途中会遇到狠多高高低低,上上下下的障碍物,小新需要用到不同的操作力度和按键方案来使模型跳到要求的高度从而越过障碍,连续调高是比较难的操作,小新反反复复完了很多遍,都没能前进很多。于是他希望从失败中寻找一些规律,以便下次再玩时会轻松的越过这些障碍。
我们假设一共有n个障碍物,从左到右分别用1到n来标识。我们用一个整数ai来标识小新需要在第i个障碍物处恰好跳到ai的高度才可以越过该障碍,如果连续3个障碍物的高度是不递减的,即ai<=ai+1<=ai+2,那么小新会将这里记为障碍难点,注意每个障碍物可以被记录多次,例如连续5个障碍物的高度分别为1 2 3 4 5,这里有3个障碍难点,分别为1 2 3,2 3 4,3 4 5.
现在小新已知n个障碍物的高度,想知道区间[l,r]里一共有多少个障碍难点,你能帮助他计算一下么?
输入:
第一行一个整数n,1<=n<=20000;
第二行n个整数,1<=ai<=100000000;
第三行一个整数m,表示有m次询问,1<=m<=200000;
接下来m行每行2个整数l,r,1<=l<=r<=200000;
输入规模较大,cin/cout读写速度较慢,推荐使用scanf/printf。
输出:
一共m行,每行对应一个查询。
样例输入:
5
1 2 3 4 4
5
1 2
1 3
2 4
2 5
4 4
样例输出:
0
1
1
2
0
C++实现没管cin和cout,逻辑对,但是只能通过80%,不知道为什么。
// ConsoleApplication4test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#include #include #include using namespace std;bool fun2(int&a, int&b, int&c){ if (c>=b&&b>=a) { return true; } else { return false; }}int fun1(vector & v,int& k,int& e ){ int count = 0; for (int i = (k-1); i < (e-2); i++) { if (fun2(v.at(i),v.at(i+1),v.at(i+2))) { count++; } } return count;}int _tmain(int argc, _TCHAR* argv[]){ int n; cin >> n; vector v; int temp_num; for (int i = 0; i < n; i++) { cin >> temp_num; v.push_back(temp_num); } int m; cin >> m; vector s; for (int i = 0; i < 2*m; i++) { cin >> temp_num; s.push_back(temp_num); } for (int i = 0; i < m; i++) { cout << fun1(v, s.at(2*i), s.at(2*i + 1)) << endl; } return 0;}
Java:同学写的是80%
1 public static void main(String[] args) { 2 3 4 Scanner scanner = new Scanner(System.in); 5 int n = scanner.nextInt(); 6 7 8 int[] num = new int[n]; 9 for (int i = 0; i < n; i++) {10 num[i] = scanner.nextInt();11 }12 13 int m = scanner.nextInt();14 int[][] mm = new int[m][2];15 scanner.nextLine();16 17 18 for (int i = 0; i < m; i++) {19 if (n < 3) {20 System.out.println(0);21 }22 23 String[] s = scanner.nextLine().split(" ");24 mm[i][0] = Integer.parseInt(s[0]);25 mm[i][1] = Integer.parseInt(s[1]);26 if ((mm[i][1] - mm[i][0]) < 2) {27 System.out.println(0);28 } else {29 int k = mm[i][0] - 1;30 int g = mm[i][1] - 1;31 32 int count = 0;33 for (int l = k; l + 2 <= g; l++) {34 if (num[l] <= num[l + 1] && num[l + 1] <= num[l + 2]) {35 count++;36 }37 }38 System.out.println(count);39 }40 }41 }