OpenJudge 1 11 0 7 和為給定數

2021-07-13 04:02:16 字數 1155 閱讀 8289

描述

給出若干個整數,詢問其中是否有一對數的和等於給定的數。

輸入 共三行:

第一行是整數n(0 < n <= 100,000),表示有n個整數。

第二行是n個整數。整數的範圍是在0到10^8之間。

第三行是乙個整數m(0 <= m <= 2^30),表示需要得到的和。

輸出 若存在和為m的數對,輸出兩個整數,小的在前,大的在後,中間用單個空格隔開。若有多個數對滿足條件,選擇數對中較小的數更小的。若找不到符合要求的數對,輸出一行no。

樣例輸入

4 2 5 1 4

6 樣例輸出

1 5這個題也是很水的,下面講講思路:

很簡單 就是二分招數(這不廢話麼……)

咳咳 ,好吧。不繞彎了,題目給了你兩個數,這咋找呢?

二分不能找兩個數,所以我們想到找乙個。

於是先排序,上sort。

先用m減去最小的a[i];

即 b=m-a[i];再二分查詢b就ok了

就算題目說選擇更小的數,那也沒關係,從最小開始找

已經解決這個問題了。

值得注意的是

看下面的資料:

4 1 2 3 9

6 容易一眼看出了 其實應該是輸出」no」的,

但是程式容易輸出3 3

這是乙個坑分的地方,因為乙個數不能用兩遍(程式不知道啊),

所以要你來解決,

只要把用的這個a[i]=0;找完一遍再賦值回來就行了!

還有二分區間的邊界

如果 l=0,r=n+1的話

while(l < r )

如果 l=1,r=n的話

就找 while( l <= r )

(這個區間坑我了好久(>_<) )

好了廢話不多說了上**:

#include

using

namespace

std;

int a[1000010];

int main()

if(b>a[mid]) l=mid+1;

else r=mid-1;

}a[i]=tot;

}cout

<<"no";

return

0;

openjudge 1 11 07和為給定數

描述 給出若干個整數,詢問其中是否有一對數的和等於給定的數。輸入共三行 第一行是整數n 0 n 100,000 表示有n個整數。第二行是n個整數。整數的範圍是在0到10 8之間。第三行是乙個整數m 0 m 2 30 表示需要得到的和。輸出若存在和為m的數對,輸出兩個整數,小的在前,大的在後,中間用單...

open judge類和物件

描述 用友元類解決下面的問題 設計乙個point 類.其中 資料成員 點的座標x,y 成員函式 帶有參的建構函式 不帶預設值 其他成員函式不做要求。定義乙個line類 要求 資料成員 線上的兩個點point1,point2 用定義好的point 成員函式 定義一條直線 計算線段的長度 輸入兩個點的座...

OpenJudge 和為給定數

描述 給出若干個整數,詢問其中是否有一對數的和等於給定的數。輸入共三行 第一行是整數n 0 n 100,000 表示有n個整數。第二行是n個整數。整數的範圍是在0到10 8之間。第三行是乙個整數m 0 m 2 30 表示需要得到的和。輸出若存在和為m的數對,輸出兩個整數,小的在前,大的在後,中間用單...