链家在线测评编程题

来源:互联网 发布:淘宝助手上传宝贝教程 编辑:程序博客网 时间:2024/04/29 15:43

这里写图片描述

这里写图片描述

我感觉这就是简单的二分查找就行了,因为区间编号是有序了的啊,但是不能直接套二分查找,需要找出每个区间的的范围,然后修改判断条件就行了,代码如下:

// Lianjia01.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <fstream>#include <string>#include <vector>#include <list>#include <stack>#include <map>#include <queue>#include <set>#include <iterator>#include <algorithm>using namespace std;int findk(int * arrS, int * arrE, int low, int high, int key) {    if (low > high)        return -1;    int mid = low + (high - low) / 2;    if (key >= arrS[mid] && key <= arrE[mid])return mid+1;    else if (key >= arrE[mid])return findk(arrS, arrE, mid + 1, high, key);    else return findk(arrS, arrE, low, mid - 1, key);}int main(){    ifstream fin("file.txt");    int n;    fin >> n;    int * arr = new int[n];    for (int i = 0;i < n;++i)fin >> arr[i];    int * arrS = new int[n];    int * arrE = new int[n];    arrS[0] = 1;    arrE[0] = arr[0];    int sum = 0;    for (int i = 0;i < n-1;++i)    {        sum += arr[i];        arrS[i+1] = sum + 1;        arrE[i] = sum;    }    sum += arr[n - 1];    arrE[n - 1] = sum;    /*for (int i = 0;i < n;++i)    cout << arrS[i] << "   " << arrE[i] << endl;*/    int q;    fin >> q;    int query;    for (int i = 0;i < q;++i)    {        fin >> query;        cout << findk(arrS, arrE, 0, n, query) << endl;    }    return 0;}