总结:
函数rand()与strand(),time():
rand():以某个随机数种子产生随机数。
注:这种随机数不是真正的随机数,相同随机数种子产生的随机数是相同的
例:
int a,b;
a=rand();
cout<<a<<endl;
b=rand();
cout<<b<<endl;
第一次执行上面的代码输出的数据:
41
18467
第二次执行输出的数据同样是:
41
18467
srand():用于设置rand()使用 的随机数种子。
注:在调用rand()之前没有调用srand()则系统会默认设置一个srand(1);
函数原型:
void srand(unsigned seed);
seed:srand的种子,用于初始化srand的起始值。
time():获取系统的时间
包含头文件: time.h
调用:
1.time(&a)//a为time_t型变量
2.time(NULL);
利用srand(),time()可以为rand()提供一个不断变化的随机数种子。
形式:srand(time(NULL));
例:
srand(time(NULL));
int a;
a=rand();
cout<<a;
每次输出a的值都是随机的。
函数max(a,b),min(a,b):
max(a,b):比较a与b的大小,返回最大值
min(a,b):比较a与b的大小,返回最小值
memset函数:
包含头文件:memory.h
作用:将某元素,数组等的数据用别的值替换
调用;
memset(地址,用于替换的字符,大小);
注:该函数一般用于给数据清零或者给字符型数组以字符或者ASC码换值。
大小:指需要替换的元素的总字节数
例:
int a[5],b[5],k;
char c[5],d[5];
memset(a,0,sizeof(a));
memset(b,1,sizeof(b));
memset(c,97,sizeof(c));
memset(d,'a',sizeof(d));
for(k=0;k<5;k++)
cout<<a[k]<<endl;
for(k=0;k<5;k++)
cout<<b[k]<<endl;
for(k=0;k<5;k++)
cout<<c[k]<<endl;
for(k=0;k<5;k++)
cout<<d[k]<<endl;
输出:
0
0
0
0
0
16843009
16843009
16843009
16843009
16843009
a
a
a
a
a
a
a
a
a
a
ios::sync_with_stdio(false):
cin,cout的效率要比scanf,printf的效率要低是因为cin,cout要先把输入/输出的数据存入缓冲器再输入/输出,因此导致cin,cout的效率降低。
而ios::sync_with_stdio(false);的作用就是关闭iostream的缓冲器,让cin,cout的效率与scanf,printf的效率相差不大.
例:
int main()
{
ios::sync_with_stdio(false);
......
}
在执行getline()函数时被跳过:
如下代码:
string x;
int a,k;
for(k=0;k<3;k++)
{
cout<<"x:";
getline(cin,x);
cout<<"a:";
cin>>a;
}
输出:
x:a
a:4
x:a:5
x:a:1
可以看到,在第二次循环开始getline就被跳过了
原因:
1.cin输入不接收回车。每次按回车键结束输入后回车会被cin吐出,回车依旧存在直到被接收。
而能够接收回车的有getline(),cin.ignore,cin.get等。
又因为getline(),cin.get接收回车的同时会执行回车的指令且不需要回车前有任何数据,因此造成了getline被跳过的现象。
注:cin不接收回车但也会执行回车的指令,但必须在回车前要有正常的数据,否则无法执行回车的指令,并且会将该回车无效化
例:
char a,b,c,d;
cin>>a;
cin>>b;
cin>>c;
cin>>d;
cout<<a<<endl<<b<<endl<<c<<endl<<d;
输出:
abcd//此处输入了a,b,c,d,回车。
a//第一个cin接收了字符a并执行了回车,并将多出的,无法接收的数据b,c,d以及回车吐出
b//第二个cin接收了字符b并执行了上一个cin吐出的回车
c
d
int a,b,c;
cin>>a;
cin>>b;
cin>>c;
cout<<endl;
cout<<a<<endl<<b<<endl<<c;
输出:
5
5//因为在上一个cin吐出的回车之前无正常的数据可接收,所以将上一个回车无效化,并重新输入
5
5
5
5
int a;
string b,c;
cin>>a;
getline(cin,b);
getline(cin,c);
cout<<endl;
cout<<"a:"<<a<<endl<<"b:"<<b<<endl<<"c:"<<c;
输出:
4
a//因为第一个getline接收了回车且直接执行回车的指令,所以第一个getline被跳过而第二个getline可正常进行
a:4
b:
c:a
解决getline被跳过的方法:
在需要正常执行的getline上面写一行能够接受回车的代码;
此处建议使用cin.ignore()函数;
cin.ignore(a,b)函数: a:数字,b:字符
含义:在cin.ignore处输入数据并提取部分字符,抛弃所提取的字符。每抛弃一个字符,计数器加1同时比较字符。如果计数器的数值达到a或者被抛弃的字符是b则cin.ignore(a,b)函数执行终止。并且吐出未被抛弃的字符,这些被吐出的字符则被下一个输入流接收。
例:
string a;
cin.ignore(5,'a');
getline(cin,a);
cout<<a;
/*
dsftlkawgb//a在第7位
kawgb
Process returned 0 (0x0) execution time : 15.217 s
Press any key to continue.
dsfatrrzl//a在第4位
trrzl
Process returned 0 (0x0) execution time : 16.397 s
Press any key to continue.
*/
注:回车代表一个字符,在抛弃回车后计数器加一
用cin.ignore解决getline()被跳过的代码示例:
string b;
int a;
cin>>a;
cin.ignore(0xfffff,'\n');//注:\n指回车,同样可以用EOF指回车
cout<<"a:"<<a<<endl;
getline(cin,b);
cout<<"b:"<<b;
输出:
5
a:5
as
b:as
贪心算法的部分总结+感悟
贪心算法是一种求最优解的算法思想。通过局部最优解反馈到整体的最优解。
解决贪心算法问题的核心是找到贪心策略。
解决贪心算法的问题不是直接从总体下手而是从局部下手,通过找局部的最优解一步一步优化到整体的最优解,这样才能够更快找到贪心策略。
但尽管如此我有时还是会找不到最好的贪心策略,明明自己测试时都能够成功但是交上去就总是超时。所以我觉得想要找到好的贪心策略还应该有着良好的数学基础,找到最快的运算方法。
感悟:
学习C++时不能只学习纸上的代码,还要发散自己的思维,尝试多种多样的情况,这样能够发现代码真正的意思,了解到代码到底是如何执行的。发散思维不仅能帮助我们了解代码,还能够促使我们去学习更多的代码或代码的执行方式。