給出乙個整數k和乙個無序陣列a,a的元素為n個互不相同的整數,找出陣列a中所有和等於k的數對。例如k = 8,陣列a:,所有和等於8的數對包括(-1,9),(0,8),(2,6),(3,5)。真的是大意。。。還以為一級演算法題就是暴力出奇蹟。。。。想都沒想就打了個暴力-------結果瘋狂tinput
第1行:用空格隔開的2個數,k n,n為a陣列的長度。(2 <= n <= 50000,-10^9 <= k <= 10^9)output第2 - n + 1行:a陣列的n個元素。(-10^9 <= a[i] <= 10^9)
第1 - m行:每行2個數,要求較小的數在前面,並且這m個數對按照較小的數公升序排列。input示例如果不存在任何一組解則輸出:no solution。
8 9-16output示例5342
908
-1 90 82 6
3 5
這題需要注意的點:
常規暴力做法很容易想到 兩個for迴圈 每乙個a[ i ] 遍歷每乙個a[ j ]看看和是否是k
然後因為 陣列中各個數字各不相同 所以 先從小到大排序
然後 i從前往後 j從後往前 (i < j) 向中間逼近尋找
然後第乙個優化j 是從後往前找的 當找到了 a[i]+a[j]==k的時候 就可以break了 因為此時相等 而前邊的都小於此時的a[ j ] ,a[ i ]又不變,所以前邊肯定就沒有答案,直接break。
第二個優化i 是從前往後找的 比如 陣列 2 3 4 5 6 7 8 9 10 k=10
當我們找到了a[ i ]=3 a[ j ]=7 時 下一次 i 往後移 想要等於k j只能往前移動 那麼 7和7以後的數字都不會存在正解,所以不用浪費時間每次都從最後往前找,每次都從上次的答案往前找就可以了。
這其實是剪枝的思想 寫**時候還是要多注意 能優化就優化 **
#include#include#include#include#includeusing namespace std;
const int maxn=1e5+7;
const int inf=0x3f3f3f3f;
typedef long long ll;
ll n,k;
ll a[maxn];
int main()}}
if(f==0)printf("no solution\n");
}
然後看了別人,更優秀的做法 ,線性時間就ok。**簡單易懂,還是自己想的太少。
#include#include#include#include#includeusing namespace std;
const int maxn=1e5+7;
const int inf=0x3f3f3f3f;
typedef long long ll;
int n,k;
int a[maxn];
int main()
sort(a,a+n);
bool flag=false;
int i=0,j=n-1;
while(ielse if(nelse j--;//大於n的話 j向前走
}if(!flag)printf("no solution\n");
}
51nod1001 陣列中和等於k的數對
1001 陣列中和等於k的數對 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 給出乙個整數k和乙個無序陣列a,a的元素為n個互不相同的整數,找出陣列a中所有和等於k的數對。例如k 8,陣列a 所有和等於8的數對包括 1,9 0,8 2,6 3,5 input 第1...
51Nod 1001 陣列中和等於K的數對
給出乙個整數k和乙個無序陣列a,a的元素為n個互不相同的整數,找出陣列a中所有和等於k的數對。例如k 8,陣列a 所有和等於8的數對包括 1,9 0,8 2,6 3,5 input 第1行 用空格隔開的2個數,k n,n為a陣列的長度。2 n 50000,10 9 k 10 9 第2 n 1行 a陣...
51Nod 1001 陣列中和等於K的數對
給出乙個整數k和乙個無序陣列a,a的元素為n個互不相同的整數,找出陣列a中所有和等於k的數對。例如k 8,陣列a 所有和等於8的數對包括 1,9 0,8 2,6 3,5 先將a進行排序,我們對a中的每個元素查詢對應的數對時,可以採用二分查詢,因為是順序排列了。剪枝 當a中的元素值的兩倍大於等於k時,...