在pcFindNormal()函数中,每次循环比较了 i<iLen 和 pcStr[i] == c 。
而在pcFindSentry()函数中,每次循环只比较了pcStr[i] == c。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#define BUF_SIZE 100000000
char *pcFindNormal(char *pcStr, char c)
{
int iLen = strlen(pcStr);
for (int i=0; i<iLen; i++)
{
if(pcStr[i] == c)
{
return &pcStr[i];
}
}
return NULL;
}
char *pcFindSentry(char *pcStr, char c)
{
int iLen = strlen(pcStr);
if(pcStr[iLen-1] == c)
{
return &pcStr[iLen-1];
}
char cHold = pcStr[iLen-1];
pcStr[iLen-1] = c;
int i;
for (i=0; ; i++)
{
if(pcStr[i] == c)
{
break;
}
}
pcStr[iLen-1] = cHold;
return (i<iLen-1) ? (&pcStr[i]) : NULL;
}
int main()
{
char *pcStr = (char*)malloc(sizeof(char)*BUF_SIZE);
if(pcStr == NULL)
{
printf("malloc errorn");
}
for (int i=0; i<BUF_SIZE; i++)
{
pcStr[i] = '2';
}
pcStr[BUF_SIZE-3] = '1';
struct timeval stStart;
struct timeval stEnd;
struct timezone stZone;
gettimeofday(&stStart, &stZone);
char *pcRet = pcFindNormal(pcStr, '1');
if(pcRet == NULL)
{
printf("pcFindNormal errorn");
}
gettimeofday(&stEnd, &stZone);
printf("normal spend time: %ldmsn",
(stEnd.tv_sec-stStart.tv_sec)*1000+(stEnd.tv_usec-stStart.tv_usec)/1000);
memset(&stStart, 0, sizeof(stStart));
memset(&stEnd, 0, sizeof(stEnd));
memset(&stZone, 0, sizeof(stZone));
gettimeofday(&stStart, &stZone);
pcRet = pcFindSentry(pcStr, '1');
if(pcRet == NULL)
{
printf("pcFindSentry errorn");
}
gettimeofday(&stEnd, &stZone);
printf("Sentry spend time: %ldmsn",
(stEnd.tv_sec-stStart.tv_sec)*1000+(stEnd.tv_usec-stStart.tv_usec)/1000);
free(pcStr);
return 0;
}
vector的容量满了的时候,就从新分配一块2倍大小的空间,然后把
数据全部拷贝到新的空间,再把旧的空间释放。
一开始vector的空间大小为1,那么每次从新分配空间的时候为:
1 , 2, 4, 8, 16, 32, ....
2^0 + 2^1 + 2^2 + 2^3+2^4 + .... + 2^(logn) 以2为底
这个式子算出来结果为 2 * 2^(logn) - 1 = 2n = O(n)
所以用vector保存了n个数的时候,时间复杂度为O(n),所以对每个数字均摊来说,时间复杂度是O(1)
求一个数的全部的约数,时间复杂度为 O(n^(1/2)),就是n的二分之一次方。
比如求100的全部约数。
暴力解法:从1遍历到100.
但是当我们遍历到2的时候,就可以知道100的另一个约数是50了。
所以没有必要全部遍历,只要遍历到 sqrt(100) 就能够找到全部的约数了。
证明:
1,2,3,4,.....,n sort
他们的全排列是 n!
而排序好的1~n则是全排列中的一种。
每一次比较 i < j, 最优的情况则是去掉了 n! 种情况中的一半, n!/2
第0次, n!
第1次,n!/2
第2次,(n!/2)/2 = (n!)/(2^2)
...
第k次, (n!)/(2^k)
当 (n!)/(2^k) = 1时,算法结束
n! = 2^k,然后两边取以2为底的对数
log(n!) = k,而 n! 约等于 n^n,并且 n^n > n!
log(n^n) = k
nlog(n) = k
所以时间复杂度为 nlogn
某旅游城市在长江边开辟了若干个旅游景点。 一个游船俱乐部在这些景点都设置了游艇出租站。 游客可在这些游船出租站租用游船,并在下游的任何一个游船出租站归还游船, 从一个游船出租站到下游的游船出租站间的租金明码标价。 你的任务是为游客计算从起点到终点站间的最小租船费用。
输入文件有若干组数据,
每组测试数据的第一行上有一个整数 n(1<=n<=100),表示上游的起点站 0 到下游有 n 个游船出租站 1,2,。。。,n。
接下来有 n 行,
这 n 行中的第 1 行有 n 个整数,分别表示第 0 站到第 1,2,3,。。。,n 站间的游船租金;
第 2 行有 n-1 个整数,分别表示第 1 站到第 2,3,4,。。。n 站间的游船租金;
第 n-1 行有 2 个整数,表示第 n-2 站到第 n-1、n 站间的游船租金;
第 n 行有 1 个整数,表示第 n-1 站到第 n 站间的游船租金。
一行上有两个整数之间是用空格隔开的。
两组测试数据之间无空行。
对输入文件中的每组测试数据,先在一行上输出 “Case #:”, 其中 “#” 测试数据的编号(从 1 开始)。 再输出一行,内容是该情况下游客从起点站到终点站间的最少租船费用。
输入样例
3
2 3 6
1 3
2
输出样例
Case 1:
5
v[i][j] 为从i到j不换船的花费
f[i][j] 为从i到j最小的花费
if(i+1 == j)
f[i][j] = v[i][j]
else
f[i][j] = min( v[i][j], f[i][j-1] + v[j-1][j] )
打开任务计划
左下角开始–>搜索任务计划
char acCmd[2048] = {0};
QString strAppName = QApplication::applicationFilePath();
QByteArray baAppName = strAppName.toUtf8();
char * pcAppName = baAppName.data();
m_bAutoStart = ui->autoStartCheckBox->isChecked();
qIni->m_vSetAutoStart( m_bAutoStart );
if(m_bAutoStart)
{
sprintf(acCmd, "schtasks /Create /F /RL HIGHEST /SC ONLOGON /TN \"DIASkipUAC\" /TR \"\'%s\' \"AutoStart\"\"", pcAppName);
LOG_PRINTF(EError, EthDirect, "CSetting::m_vApplySetting() acCmd=[%s]\n", acCmd);
QString strCmd = QString(acCmd);
int iRet = QProcess::execute(strCmd);
if((iRet!=-1) && (iRet!=-2))
{
printf("schtasks DIASkipUAC create success\n");
}
else
{
printf("schtasks DIASkipUAC create failed\n");
}
}
else
{
sprintf(acCmd, "schtasks /Delete /F /TN \"DIASkipUAC\"");
LOG_PRINTF(EError, EthDirect, "CSetting::m_vApplySetting() acCmd=[%s]\n", acCmd);
QString strCmd = QString(acCmd);
int iRet = QProcess::execute(strCmd);
if((iRet!=-1) && (iRet!=-2))
{
printf("schtasks DIASkipUAC delete success\n");
}
else
{
printf("schtasks DIASkipUAC delete failed\n");
}
}