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");
}
}
输入分为缓冲输入和非缓冲输入。
缓冲输入分为完全缓冲输入和行缓冲输入。
完全缓冲输入:当缓冲区满时被清空。
行缓冲:遇到一个换行字符时将被清空。
键盘输入是标准的行缓冲,因此按下回车键将清空缓冲区。
使用标准I/O包时,就会自动屏蔽掉不同系统下的文件差异。
例如:要检查一个换行符,可以使用 if(ch==’\n’)
如果该系统实际上使用回车/换行的组合,则I/O函数自动在两种表示法之间转换。
int ch;
while ((ch = getchar()) != EOF)
putchar(ch);
拷贝一份mywords的副本
mycopy > savewords < mywords (正确)
mycopy < mywords > savewords (正确)
mycopy < mywords > mywords (错误)
这是不对的,原因是 > mywords 使原始的mywords文件在用于输入之前就被截断为空了。
Tips: 输入不能来自一个以上的文件,输出也不能定向至一个以上的文件。
>> 向一个现有文件的末尾追加数据。
| 管道运算符,它可以将一个程序的输出与第二个程序的输入连接起来。
while (getchar() != '\n')
continue;
getchar() 和 scanf() 在检测到文件结尾时,都返回 EOF