程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Codechef Not a Triangle題解

Codechef Not a Triangle題解

編輯:C++入門知識

找出一個數組中的三個數,三個數不能組成三角形。

三個數不能組成三角形的條件是:a + b < c

兩邊和小於第三邊。

這個問題屬於三個數的組合問題了。暴力法可解,但是時間效率就是O(n*n*n)了,很慢。

不過既然是組合問題就必定可以使用排序後處理的方法降低時間效率的。


這裡降低時間效率的方法是:

選一個最大的數c,然後選兩個小數a和b,其中a < b,如果符合條件,那麼兩個數中間的數必定都可以作為b符合條件a + b < c

這樣可以把時間效率降到O(n*n)。


這個規律也不好找啊。要非常認真觀察,然後總結出來。

處理一個數組,要從小到大,從大到小反復觀察,尋找其規律。


原題:http://www.codechef.com/problems/NOTATRI/


#include 
#include 
#include 
using std::sort;

class NotATriangle
{
	//細心找出其規律進行優化
	int getNotTris_3(int *A, const int n)
	{
		sort(A, A+n);
		int i = 0, j = 1, k = n-1, ans = 0;
		for ( ; k >= 2; k--)
		{
			i = 0, j = k-1;
			while (i < j)
			{
				if (A[i] + A[j] < A[k])
				{
					ans += j - i;
					i++;
				}
				else j--;
			}
		}
		return ans;
	}
public:
	NotATriangle()
	{
		int N = 0;
		while (scanf("%d", &N) && 0 != N)
		{
			int *A = (int *) malloc(sizeof(int)* N);
			for (int i = 0; i < N; i++)
			{
				scanf("%d", &A[i]);
			}
			printf("%d\n", getNotTris_3(A, N));
			free(A);
		}
	}
};

int notATriangle()
{
	NotATriangle ntir;
	return 0;
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved