日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法竞赛入门经典(第二版)】_要点提取(第三章)

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法竞赛入门经典(第二版)】_要点提取(第三章) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 3.1數組
    • 數組大小為常量
    • x++ 與 ++x
    • 比較大的數組要在main函數外聲明!
    • 函數:memcpy()
    • 例一:開燈問題
      • 初始化的重要性
      • 函數:memset()
      • 取反( ! )符號妙用
      • 避免輸出多余空格的技巧
    • 例二:蛇形填數
      • C語言簡潔的優勢
      • 先判斷,再移動!
      • 避免非法訪問內存!
  • 3.2 字符數組
    • 例三:豎式問題
      • scanf("%s" , s)
      • printf("%5d") 與 printf("%05d")
      • sprintf()
      • 函數:strlen()
      • 函數:strchr()
  • 3.3 競賽題目選講
    • 例3-1:TeX中的引號
      • 字符串的輸入
      • 三目運算符
    • 例3-2 WERTYU
      • “重構字典新定義法”
    • 例3-3 回文詞
      • 函數: isalpha()
    • 例3-4 猜數字的提示
    • 例3-5 生成元
    • 例3-6 環狀序列
  • 3.4 注解與習題

3.1數組

數組大小為常量

對于新手而言,最容易犯的錯誤就是:在定義數組時,將數組的范圍定義成了變量。
錯誤示范:

int num ; cin >> num ; int a[num] ;//錯啦!數組范圍不能為變量!

但我們偶爾也會利用宏定義來設定數組范圍。
什么是“宏定義”?
就是對于整個程序中,給一個常量起個名字,例如:

#define maxn 1010 //將1010起名字叫maxn

x++ 與 ++x

簡單來說,對于“x++”,記住:
** 先工作,再加薪! **
也就是說,對于

y = x++ ;

來說,先將x的值賦給y再自己加一 也就是等于

y = x ; x = x + 1 ;

而對于“++x” ,則是:
** 先加薪,再工作! **

y = ++x ;

等于

x = x + 1 ; y = x ;

比較大的數組要在main函數外聲明!

函數:memcpy()

作者在講述兩個數組a , b之間互相復制的關系時引入了函數memcpy(),并給出了相關操作:

memcpy(b , a , sizeof(int) * k) ; //將數組 a復制 k 個元素到數組 b memcpy(b , a , sizeof(a)) ; //直接取等

還可以推廣到 double 類型變量。
該函數的頭文件為:

#include <cstring>

接下來作者引入了一道例題。

例一:開燈問題

一道純種模擬題。我們可以從中學到很多。

初始化的重要性

作者在一開始就提到了初始化的重要性,尤其是在多組輸入之中,我們要格外注意。

函數:memset()

那么,我們應該如何解決初始化操作呢?尤其是多維數組,用n個for 嵌套循環實在是太麻煩了。
由此,引入了第二個函數: memset() 。
用法如下:

memset(a , 0 , sizeof(a)) ;

作用:把數組a清零。后面還會有“把數組a全部命名為-1”的操作。我們后續再說。
頭文件:

#include<cstring>

取反( ! )符號妙用

一般來說,我們只會在布爾(bool)類型中使用到取反。
作者將他推廣到了 int 類型 :
當 int a = 0 時 ,
進行 a = !a 操作就可以使 a = 1

避免輸出多余空格的技巧

設置標志變量 first ,記錄只在第一行前不輸出空格
很好理解的技巧,不多贅述。

例二:蛇形填數

C語言簡潔的優勢

可以利用C語言簡潔的語法,但前提是保持代碼的可讀性。

先判斷,再移動!

而不是走一步以后發現越界了再退回來。這不是強制性要求,但養成良好習慣十分必要。

避免非法訪問內存!

通過短路運算符“&&”來保證不會訪問非法內存。

3.2 字符數組

本節開篇引入了一個例題來講解字符數組。

例三:豎式問題

scanf("%s" , s)

作者引入了一個新概念 scanf("%s" , s) 。

他會讀入一個不含 空格 、 TAB 、 回車符 的字符串,存入數組s。

由于 s 為字符型數組,直接表示指針,因此可不用"&"(取地址符)。

printf("%5d") 與 printf("%05d")

對于一個數按5位打印,如果小于五位數,前者補空格,后者補0 。

sprintf()

sprintf(buffer , "%d%d%d" , x , y , z) ; //表示把x , y , z三個數字連在一起輸出到字符串buffer //最后的結果是 buffer 為字符串類型 // 例如 :x = 10(int) , y = 20(int) , z = 30(int) // buffer = 102030(string)

由此引入了 fprintf(輸出到文件) 、printf(輸出到屏幕)、sprintf(輸出到字符串) 之間的區別。

函數:strlen()

作用:獲取字符串實際長度。

下標實際長度
01
12
23
2526

函數:strchr()

strchr(str , a) ; //在 str 字符串中找 a 字符 //頭文件: #include<cstring>

推廣到

strcpy(a , b) ;//賦值b到a strcmp(a , b) ;//比較,若相同返回false strcat(a , b) ;//連接(放到a中)

3.3 競賽題目選講

每一道例題都能學到很多知識。

例3-1:TeX中的引號

字符串的輸入

作者共介紹了3種輸入方法:

函數名稱用法
fgetc(fin)讀取打開的文件fin,返回一個int值,要去除EOF符
scanf("%s" , s)遇到空格、換行就會停下
str = getchar()需要特判EOF符
fgets(buf , maxn , fin)讀取文件中的一行,最多讀取maxn-1個字符,一個字符沒讀到就返回NULL

這里沒有提到gets()因為他已經刪去了。

三目運算符

a : b ? c表示
當條件a為真時執行b反之執行c
最好不要用。

例3-2 WERTYU

“重構字典新定義法”

這里講述了一種新的算法,他類似于將答案提前寫在一個常數數組中,便于我們輸出或使用。有點類似于搜索算法中把x y值的增減提前封裝到一個數組中,是打表法的低配版。
本題中作者直接將鍵盤的格式封裝到了數組s之中,之后每次調用只需要找數組的前一位即可。
后邊還會用到他的思想。

例3-3 回文詞

又是一道“字典法”的題!
補充一下數組 msg[m*2+p]的含義是:
作者將數組分成了兩個板塊(就像是圖書館分成小說區、科普區…)m可以決定他是否是鏡像類,當是鏡像類時,m=1,此時直接去鏡像區[2,3]去找答案。反之,m=0,去非鏡像區找答案。而p決定著圖書所在的排數。
綜上就可以精準的定位答案的位置。

函數: isalpha()

isalpha() ;//檢查是否為字母 isdigit() ;//檢查是否為數字 isprint() ;//檢查是否為可打印字符 toupper() ;//轉大寫 tolower() ;//轉小寫 //頭文件: #include<cctype>

例3-4 猜數字的提示

小心格式!!!!
每個數對前有空格!

例3-5 生成元

c++中 無窮大的表示方法為:

#define INF 0x3f3f3f3f

例3-6 環狀序列

很好的模擬題。
輸出字符(串):

putchar() ;

3.4 注解與習題

另發題解,請關注~

總結

以上是生活随笔為你收集整理的【算法竞赛入门经典(第二版)】_要点提取(第三章)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。