ACM演算法 常數和語言基礎

2021-07-24 05:22:33 字數 3971 閱讀 1024

unsigned  int   0~4294967295  

int  2147483648~2147483647

unsigned long 0~4294967295

long  2147483648~2147483647

long long的最大值:9223372036854775807

long long的最小值:-9223372036854775808

unsigned long long的最大值:18446744073709551615

__int64的最大值:9223372036854775807

__int64的最小值:-9223372036854775808

unsigned __int64的最大值:18446744073709551615

2. 標頭檔案

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;//無窮大

int dx[8]=;//八個方向

int dy[8]=;

int dir[4][2]=;//四個方向(應用於搜尋題)

3. 常用函式

#include

int getchar();//讀取乙個字元,一般用來去掉無用字元,如回車符等

char *gets(char *str);//讀取一行字串

#include

void *malloc(size_t size);//動態分配記憶體,開闢大小為size的空間

void sort();//快速排序,c++

/*呼叫*/sort(a,a+n);//從小到大sort(a,a+n,cmp);//從大到小

void qsort();//c

#include

可直接呼叫函式:正弦sin(), 反正弦asin(), 對數log(), 平方根sqrt(), 次方pow(n,x)。

#include

memset(array,0,sizeof(array));//初始化記憶體,長用來初始化陣列

4. 無窮大

對於int型別的資料,如果我們想用乙個數來表示無窮大,使得它比輸入的所有的數都大,可以選擇0x3f3f3f3f或

0x7fffffff

0x3f3f3f3f 數值為 1061109567

0x7fffffff  數值為2139062143

負無窮大則可以用 -0x3f3f3f3f 或 -0x7fffffff

-0x3f3f3f3f 數值為-1061109567

-0x7fffffff 數值為-2139062143

在題目中常使用 0x3f3f3f3f,因為0x7fffffff 容易越界,定義全域性變數

const int inf = 0x3f3f3f3f;

5. memset()初始化

假設定義了以下陣列:

int a[10];

double b[10];

bool ok[10];

memset(a, -1, sizeof(a)); //正確,將int型a陣列元素初始化為 -1

memset(b, -1, sizeof(b)); //錯誤,不可以將double型的b陣列初始化為 -1

memset(ok, -1, sizeof(ok));//錯誤,不可以將bool型的ok陣列初始化為-1

memset(a, 0, sizeof(a)); //正確,將int型a陣列元素初始化為0

memset(b, 0, sizeof(b)); //正確,將double型b陣列初始化為 0

memset(ok, 0, sizeof(ok));//正確,將bool型的ok陣列初始化為0

memset(a, 1, sizeof(a));//錯誤,不可以將int型a陣列元素初始化為0

memset(b, 1, sizeof(b)); //錯誤,不可以將double型b陣列初始化為 0

memset(ok,1, sizeof(ok)); //正確,可以將bool型的ok陣列初始化為1

對於無窮大的初始化:

const int inf = 0x3f3f3f3f;

const int inf = 0x7fffffff;

memset(a, inf, sizeof(a));//正確

memset(a, inf, sieof(a)); //錯誤

對於int型陣列a可以用0x3f3f3f3f初始化,但不可以用0x7fffffff,如果非要把a陣列初始化為0x7ffffff,可以用語句 fill(a, a+n, inf); //n為元素個數

6. 隨機數

srand(time(0)); //根據系統時間設定隨機數種子

int i = rand() % n; //生成區間[0,n)的整數

7. 輸入輸出

(1) int,double型

int a;

double b;

輸入:cin>>a; 或 scanf("%d",&a);

cin>>b; 或 scanf("%lf",&b);

輸出:cout<

cout(2) char型

char ch;

輸入: cin>>ch; 或scanf("%c",&ch);

scanf("%c",&ch);

不常用,容易出錯,比如下面的例子:

cin>>ch;

coutcout《上面四句話,執行結果第二個cout輸出的不是我們原來輸入的字元,因為如果第一次輸入字元後,按了回車,那麼第二次輸入的就是回車,也就是scanf("%c",&ch);把回車吸收了。所以如果要正確使用,要在中間加上一句getchar();

cin>>ch;

coutscanf("%c",&ch);

cout《對於字元陣列 char chs[10];

輸入: cin>>chs; 或scanf("%s",chs);

注意:用字元陣列存放字串時,如果乙個字串中存在空格,cin>>chs;不可以存空格

gets(chs);可以存空格.

(3) string型

string str;

輸入:cin>>str;  或getline(cin,str);

前者不可以存放帶有空格的字串,後者可以。

(4) 混合型

110

輸入如上,每一行的三個數是連續的,要想分開存入矩陣中,讀入用scanf(「%1d」, &num);

12:08:30

輸入如上,假設這是乙個時間,那麼我們想要在輸入的時候就單獨獲取時分秒,可以用

scanf("%d:%d:%d",&h,&m,&s);

(6) 快速讀入(正負)

即輸入字元轉換成數字,效率高,在輸入資料量特別大的時候採用快速讀入可以避免超時.

inline int read()

char ch=getchar();int x=0,f=1;

while(ch>'9'||ch<'0')

while(ch<='9'&&ch>='0')

return x*f;

使用:int num;

num = read(); //輸入num

基礎演算法acm檢驗

昨天參加了一下校內acm隊選拔。第一次以考試競賽做演算法,緊張到連個陣列定義都快忘了,讀個題還讀了幾遍才反應過來。考完反省良多。順便考後總結了一下題目,其實整體還是算蠻簡單的,都是leetcode上的入門題,也是一些基礎題 本篇部落格主要是基於在去acm選拔前做心理準備時,發現搜不到判斷自己演算法水...

ACM基礎之排序演算法

在acm基礎知識中,排序是一種比較基礎但又比較重要的思想,熟練地掌握排序演算法十分有必要。排序的方法比較多,這裡重要介紹三種排序 選擇排序 插入排序 氣泡排序。一 選擇排序 1 基本思想 在要排序的一組數中,選出最小的數與第乙個數交換,然後再在剩下的數中選出最小的數與第二個數交換 直到第n 1個數與...

Go語言學習二 常數和條件語句

package main import fmt func main if else語句 if a 20else b 200 if語句巢狀 if a 100 switch case 語句,注意沒有break var grade string b var marks int 90 switch mark...