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 乔宁博 阅读(1785) |
评论 (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 乔宁博 阅读(7576) |
评论 (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 乔宁博 阅读(4512) |
评论 (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 乔宁博 阅读(1530) |
评论 (0) |
编辑 收藏