ACM用到的一些知识总结

1.模板代码

#include<iostream>

#include<fstream>

#include<stdlib.h>

#include<stdio.h>

#include<time.h>

using namespace std;

#define debug //提交代码时注释这行

 

int main()

{

#ifdef debug

 //cin重定向

 ifstream cin("E:\\c++projects\\ACM\\ACM\\test.txt");

#endif

 

//ToDo

 

//Done

#ifdef debug

 cout<<clock()/(double)CLOCKS_PER_SEC<<endl; //显示程序运行时间

getchar();

#endif

 return 0;

}

C语言方式:freopen ("E:\\c++projects\\ACM\\ACM\\test.txt","r",stdin);

2.memset用法

memset是对一个字节一个字节进行初始化。若初始化int数组,如inta[5],memser(a,1,5*sizeof(int))还是会有问题的,4个字节(每个字节都赋值1,显然一个int不可能等于1)

3. vector初学易错处:

vector<int> ia( 10 );

任何一个插入操作都将增加vector 的大小,而不是覆盖掉某个现有的元素,这看起来好像是很显然的,但是 下面的错误在初学者中并不少见:

const int size = 7;

int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 };

vector< int > ivec( size ); 

for (vector<int>::size_type ix = 0; ix <size; ++ix )

   ivec.push_back( ia[ ix ]);

程序结束时ivec 包含 14 个元素, ia 的元素从第八个元素开始插入

4. cout.setf(ios::showpoint); //设置为始终输出小数点后的数字,就是说 a = 3,它也输出 3.00000 这样

cout.precision(9);

cout.setf(ios::fixed); //设置为小数位始终有 9 位,没有这个的话就会像上面那个代码那样固定的不是小数点后面的数字了。

或者:cout<<setiosflags(ios::fixed)<<setprecision(7)<<data;

//setiosflags(ios::fixed)用定点方式表示实数

//setprecision(n)控制输出流显示浮点数的数字个数

//上两者一起用,控制小数点为数

5.循环写法:while (scanf("%d %d",&n,&m)!=EOF ){}

6.大整数输入输出方法:

long long a;

scanf("%I64d", &a);

printf("%I64d\n", a);

7. C++ math

#include <math.h> //C语言的方式

#include <cmath> //C++里的方式

#include <numeric> //标准库的数值处理头文件

int abs( int num );double fabs( double arg);long labs( long num );函数返回num的绝对值

double acos( double arg );函数返回arg的反余弦值,arg的值应该在-1到1之间

double asin( double arg );函数返回arg的反正弦值,arg的值应该在-1到1之间

double atan( double arg );函数返回arg的反正切值

double atan2( double y, double x );函数返回y/x的反正切值,并且它可以通过x,y的符号判断

(x,y)所表示的象限,其返回的也是对应象限的角度值

double ceil( double num );double floor(double arg );ceil函数返回不小于num的最小整数,如num = 6.04, 则返回7.0;floor函数返回不大于num的最大的数,如num = 6.04, 则返回6.0

double cos( double arg );double sin( doublearg );double tan( double arg );函数分别返回arg的余弦,正弦,正切值,arg都是用弧度表示

double cosh( double arg );double sinh(double arg );double tanh( double arg );

函数分别返回arg的双曲余弦,双曲正弦,双曲正切,arg都是用弧度表示的

double fmod( double x, double y );函数返回x/y的余数

div_t div( int numerator, int denominator);ldiv_t ldiv( long numerator, long denominator );

函数返回numerator/demominator操作的,返回一个结构体div_t(ldiv_t) ;div_t(ldiv_t)结构体中定义了quot(商),rem(余数)

double exp( double arg );函数返回e(自然底数)的arg次

double log( double num );函数返回num的自然对数值num应为大于0的数

double log10( double num );函数返回num以10为底的对数值,num也应该为大于0的数

double pow( double base, double exp );函数返回以base为底的exp次,不允许的取值范围:

当base 为 0 且exp 小于或等于 0;当base 为负数 且 exp 不为整数

double sqrt( double num );函数返回num的开方值,num应该为不小于0的值

double frexp( double num, int* exp );函数可以获取科学计数法的参数

函数返回在0.5到1.0之间的值, 传入exp的参数用于返回num的指数 (以2为底数计算,即:num = mantissa * (2 ^ exp))

double ldexp( double num, int exp );函数返回num*(2^exp)的值,如果结果溢出,返回HUGE_VAL

double modf( double num, double *i );函数分割num,将整数部分填入i的值,小数部分返回

8.开头参考

#include <cstdio>

#include<algorithm>

#define mod 1000000007

using namespace std;

int cishu,lizi=1,n;

long long tempk = 1,k,t;

long long shuzi[10002];

int main(){···}

9.库函数 快排

#include <stdio.h>      /* printf */

#include <stdlib.h>     /* qsort */

int values[] = { 40, 10, 100, 90, 20, 25 };

int compare (const void * a, const void * b)//从小到大排序

{

  return ( *(int*)a - *(int*)b );

}

int main ()

{

  int n;

  qsort(values, 6, sizeof(int), compare);

  for (n=0; n<6; n++)

    printf ("%d",values[n]);

  return 0;

}

10. 取“”引号中的字符,char c;while((c=getchar())!=’\”’); while((c=getchar())!=’\”’){s[i]=c;i=i+1;}

11. 求第n小或大的数用法:

bool myfunction (inti,int j) { return(i>j); }//表示按从大到小取。

int b[5]={3,1,6,5,8};

    nth_element(b,b,b+5,myfunction);//第一个参数表示开始的迭代器,第二个表示求第几大/小的数,第三个参数表示末尾(不包括末尾迭代器),第四个参数可有可无,默认是求第n大的数。添加了表示求第n小的数。注意:第n大的数,是基于起始迭代器来说的,若开始迭代器是b+1,则b[1]表示的是最大的数,并不是第2大的数。

    cout<<b[0]<<endl;

12. 合并操作:

vector<int>::iteratorp = unique(num.begin(),num.end()); unique函数返回的是一个vector<int>类型的指针,它将原数组分为两部分[num.begin(),p-1] [p,num.end()];  (前者是删除重复元素的数组,后者是重复的数组;)注意:用这个,必须unique是单调的,这样unique才能发挥,它只与存入的值比较···感觉还是自己写算了···。

#include<algorithm>

int myints[] = {10,20,20,20,30,30,20,20,10};

sort(myints,myints+9);//必不可少,等让他单调,合并操作才不会有问题

int* it = unique (myints, myints+9);

for(int i =0;i<it-myints;i++){

        cout<<myints[i]<<endl;

    }

13. 最大流问题:

求最大流的一个算法为 ford_fulkerson算法,算法思想:

1.从源点开始寻找一条路径到汇点,记录这条路径流量最小的边的流量为m,然后最大流量+=m,然后每条边的流量都减去m,然后反向更新流量(每条边反方向的流量加上m);

2.重复步骤1直到找不到路径到汇点为止,最终的最大流量即为所求的最大流。

14. 结构体用法:

#include<cstdlib>

#include<iostream>

//定义结构体

struct point

{

//包含两个变量成员

   int x;

   int y;

};using namespacestd;int main(int argc, char *argv[]){

  structpoint pt;

  pt.x=1;

  pt.y=2;

  cout<<pt.x<<endl<<pt.y<<endl;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值