1
#include <stdio.h>
2
#include <algorithm>
3
using namespace std;
4
#define MAX 1000
5
int buf[MAX];
6
void merge(int a[],int l,int m,int r)
7

{
8
int pa=l;
9
int pb=m+1;
10
int k=0;
11
12
while(pa<=m && pb<=r)
13
{
14
if(a[pa]<a[pb])
15
buf[k++]=a[pa++];
16
else
17
buf[k++]=a[pb++];
18
}
19
while(pa<=m)
20
buf[k++]=a[pa++];
21
while(pb<=r)
22
buf[k++]=a[pb++];
23
24
for(int i=0;i<k;i++)
25
a[l+i]=buf[i];
26
}
27
void mergeSort(int a[],int l,int h)
28

{
29
if(l<h)
30
{
31
int m=(l+h)/2;
32
mergeSort(a,l,m);
33
mergeSort(a,m+1,h);
34
merge(a,l,m,h);
35
}
36
}
37
void printIntArr(int n)
38

{
39
printf("%d ",n);
40
}
41
int main()
42

{
43
int a[10]=
{2,89,-1,8,0,7,13,0,11,3};
44
mergeSort(a,0,9);
45
//merge(a,0,4,9);
46
std::for_each(a,a+10,printIntArr);
47
return 0;
48
}
posted @
2010-10-01 22:42 喬寧博 閱讀(1787) |
評論 (2) |
編輯 收藏
本來是寫在CSDN上的,現在轉一下過來。
創建一個透明窗體,一種方法是設置windows下窗體的一個擴展窗口風格,在WINNT及以后,Windows開始支持用來創建透明窗體的一個API函數,先看一個效果圖:

這一個GDI繪圖的數字時鐘的窗口。實現了窗口的半透明效果。實現方法如下:
1
#define _WIN32_WINNT 0x5000 //定義WINNT的宏
2
//
3
hwnd = CreateWindow(szAppName,TEXT("Noble Qiao~"),
4
WS_POPUP | WS_SYSMENU | WS_VISIBLE ,
5
::GetSystemMetrics(SM_CXSCREEN)/2,
6
::GetSystemMetrics(SM_CYSCREEN)/2,
7
160,45,
8
NULL,NULL,hInstance,NULL);
9
//
10
::SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED);
11
SetLayeredWindowAttributes(hwnd,0,(255*70)/150,LWA_ALPHA);
SetLayeredWindowAttributes(hwnd,0,(255*70)/150,LWA_ALPHA);設置了窗體的屬性,為透明效果,其中第二個參數為alpha值,即透明度。
另外,我在使用一個游戲引擎HGE做應用時,發現了關于這個API函數的一個問題,我把這個函數的調用放在初始化一些用于渲染場景的指針變量之前時,在 winxp下運行就會運行出錯,而在 Vista 下完全正常。
我猜想在XP下,這個函數被調用后,直接調用wndproc,此時如果游戲資源(如紋理)沒有被初始化,就會出錯;而在Vista中沒有這個問題,可能是Microsoft對這個API函數做了一定修改。
posted @
2010-01-28 22:41 喬寧博 閱讀(7584) |
評論 (3) |
編輯 收藏
Visual Studio 6.0雖然是比較老(1998)的開發工具了,但是它體積比VS小,安裝速度也快。
在這里說的是 vc6 在 vista 和 win7 下的安裝問題,因為之前在網上找的說的好像都比較亂。
一開始只是聽別人說,VC++6.0在vista下不兼容,用不了,自己先裝了一下,設置成 兼容模式&管理員身份運行,結果運行就崩潰,還以為真的不行,就沒有去找傳說中可以用的SP6版。
網上搜索一般都是說SP6、管理員、兼容什么的,前幾天需要再用VC6,所以就裝了一下。在vista和win7下,安裝時都會提示說不兼容什么的,直接把不再提示那個對話框勾一下,只管安裝就是,vista和win7不一樣的地方在于,vista下需要設為“管理員身份運行”,不能設置為“兼容模式”,win7下按剛才說的,安裝完畢就可以運行了。
posted @
2010-01-26 14:07 喬寧博 閱讀(4520) |
評論 (15) |
編輯 收藏
這個題目就是找在1~N之間互質的三個正整數x、y、z,并滿足x^2+y^2=z^2,判斷這樣的數有多少對,以及跟1~N中與這些互質正整數無關的正整數的個數。
其實比較關鍵的是對上面那個式子 x^2+y^2=z^2 進行變形,減少一個變量為
(r^2-s^2)^2 + (2*r*s)^2 = (r^2+s^2)^2,
這樣只有兩個變量存在,可以減少一輪循環。于是題目就變成了找這樣的r和s,當r*r + s*s <= n時,
z = r*r + s*s;
y = max(r*r - s*s, 2*r*s);
x = min(r*r - s*s, 2*r*s);
此時,如果x、y、z互質,滿足條件的正整數組計數就加1,同時把所有與這些數相關的數組位標記為1,
for (i = 1; i*z <= n; i++)
{
flag[i*x] = flag[i*y] = flag[i*z] = 1;
}
輸出第二個結果的時候,即為輸出標志數組中值為0的元素個數。
for (i = 1; i <= n; i++)
{
if (!flag[i])/**//*The second number is the number of positive integers <=N that are not part of any triple whose components are all <=N */
num++;
}
雖然在題目中說到N最大為1,000,000 ,但是poj測試數據大概在2000內。使用2001大小的標記數組就可以過。
posted @
2010-01-04 11:04 喬寧博 閱讀(1534) |
評論 (0) |
編輯 收藏