【ACM】編程筆記

1. 編譯錯誤

1. Windows下GCC編譯環境中文亂碼

原因: Windows(中文)默認的字符集是Windows-936(GBK),而GCC編譯器默認編譯的時候是按照UTF-8解析的,當未指定字符集時一律當作UTF-8進行處理,於是造成亂碼

// 在編譯參數中增加以下兩條指令:
-fexec-charset=gbk
-finput-charset=gbk

新增: 上述方法只有在只使用 cout 輸出時有效。若要使得 printf 和 cout 輸出中文均能正常顯示,需把 cmd 的命令顯示改爲 UTF8

chcp 65001

2. Java中編譯錯誤: 編碼GBK的不可映射字符

 javac -encoding utf-8 JAVA_FILE_NAME.java && java JAVA_FILE_NAME

2. Java

Java中 String 和 Integer 的相互轉換

// 將字符串 String 轉換成整數 int。
1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]);
2). int i = Integer.valueOf(my_str).intValue();
// 將整數 int 轉換成字符串 String
1.) String s = String.valueOf(i);
2.) String s = Integer.toString(i);
3.) String s = "" + i;

3. C/C++

C++ 中 int 和 string 的相互轉換

// int 轉 string
string Int_to_String(int n) {
    ostringstream ss;
    ss<<n; //n爲int類型
    return ss.str();
}
// string 轉 int
int str2int(string str) {
    istringstream ss(str);
    int res;
    ss>>res;
    return res;
}

cin cout 加速

cin、cout慢是因爲: 默認的時候,cincinstdinstdin 總是保持同步的,也就是說 scanfscanfcincin 兩種方法可以混用,而不必擔心文件指針混亂,同時 coutcoutstdoutstdout 也一樣,兩者混用不會輸出順序錯亂。也正因爲這個兼容性的特性,導致許多額外的開銷。
解決方法:sync_with_stdio()這個函數是一個“是否兼容stdio”的開關,falsefalse 關閉所有C++標準流與其相應標準C流的同步。
進一步加速(接近scanf): 在默認的情況下 cincin 綁定的是 coutcout(cin.tie() == &cout),調用 cin>>a;cin>>a; 導致 coutcout 刷新。通過調用 cin.tie(0)解除 cincincoutcout 的綁定 , cincin 讀數據將不再導致 coutcout 刷新。

ios::sync_with_stdio(false);
cin.tie(0);

C/C++快速讀寫

整數

#include<cctype>
inline int read()
{
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
inline void write(int x)
{
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}

浮點

inline double dbread()
{
    double X=0,Y=1.0; int w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=X*10+(ch^48),ch=getchar();
    ch=getchar();//讀入小數點
    while(isdigit(ch)) X+=(Y/=10)*(ch^48),ch=getchar();
    return w?-X:X;
}

4. 經典問題

1. 一維線段是否有交集問題

線段 (a1,a2) 和 (b1,b2) 是否有交集,根據數學知識我們可以知道,當 min(a2, b2) > max(a1, b1) 時,這兩條線段有交集。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章