溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++ 從零單排(4)- ACM二

發(fā)布時間:2020-07-10 04:00:21 來源:網(wǎng)絡(luò) 閱讀:314 作者:拳四郎 欄目:移動開發(fā)

繼續(xù)刷水題?。。?/p>

這次要搞zoj的題目,Let's go!


Quicksum

http://acm.zju.edu.cn/網(wǎng)上第 2812 題

Quicksum 是一行字符串(數(shù)據(jù)包)中每個字符的位置與該字符的值的乘積之和???#26684;
的值是 0,字母的值等于它在字母表中的位置。所以,A 的值是 1,B 的值是 2,依此類推,
Z 的值是 26。下面兩個例子是求“ACM”和“MID CENTRAL”的 Quicksum:
ACM: 1*1 + 2*3 + 3*13 = 46
MID CENTRAL: 1*13 + 2*9 + 3*4 + 4*0 + 5*3 + 6*5 + 7*14 + 8*20 + 9*18 + 10*1 +
11*12 = 650

思路:用getline全部讀進來,然后挨個處理就可以了。

C++實現(xiàn)(注意ifstream cin("aaa.txt");是在調(diào)試的時候才用的,提交代碼的時候需要注釋掉):

#include <iostream> #include <fstream>  using namespace std;  int main() {     ifstream cin("aaa.txt");     char ch[256];     int i = 1;     int sum = 0;     while (cin.getline(ch,256))     {         if(ch[0] == '#') break;         for(int i = 0;ch[i] != '\0';i++)         {             if(ch[i] != ' ') sum = sum+(i+1)*(ch[i]-64);         }         cout<<sum<<endl;         sum = 0;     }     return 0; } 


Encoding

http://acm.zju.edu.cn/網(wǎng)上第 2478 題

把一個字符串中連續(xù)重復(fù)的字母從左到右寫成 kX 的形式,如果 k 是 1,那么,1 就要省略。

Sample Input
2
ABC
ABBCCC
Sample Output
ABC
A2B3C

思路:不斷讀取,不斷判斷是否與上一個字母相同,根據(jù)結(jié)果輸出。

C++實現(xiàn):

#include <iostream> #include <fstream>  using namespace std;  int main() {     //ifstream cin("aaa.txt");     string s,t;     int n;     cin >> n;     for(int i=0;i<n;i++)     {         cin>>s;         int c = 0;         t = s[0];         int tmp = 0;         for(int j=0;j<s.size();j++)         {         //When current letter equal last letter             if(s[j]==t[0])             {                 tmp++;                 //When comes to the end of s                 if(j == s.size()-1)                 {                     if(tmp==1) cout << t[0];                     else cout<<tmp<<t[0];                 }             }             //When current letter do not equal last letter             else             {                 if(tmp==1) cout<<t[0];                 else cout<<tmp<<t[0];                 t[0] = s[j];                 tmp = 1;                 if(j==s.size()-1)                 {                     if(tmp==1) cout<<t[0];                     else cout<<tmp<<t[0];                 }             }         }         cout<<endl;         s = "";     }     return 0; } 


Abbreviation

http://acm.zju.edu.cn/網(wǎng)上第 2947 題

比較兩個縮寫詞是否相同,而縮寫詞又是從一個包含多個單詞的名字中合成的。
每次讀入一個單詞,然后取出它的第一個字母,連接在字符串上,就組成了一個縮寫詞。

Sample Input
3
4
Super Harddisc Drive Cooler
4
Spade Heart Diamond Club
3
Shen Guang Hao
3
Shuai Ge Hao
3
Cai Piao Ge
4
C P C S


Sample Output
SAME
SAME
DIFFERENT


思路:挨個讀取單詞,將首字母存在string中,最后進行比較。

C++實現(xiàn):

#include <iostream> #include <fstream> #include <string>  using namespace std;  int main() {     ifstream cin("aaa.txt");     string s,ssa,ssb;     int t,n,m;     cin>>t;     for(int i=0;i<t;i++)     {         cin>>n;         for(int j=0;j<n;j++)         {             cin>>s;             ssa = ssa + s[0];         }         cin>>m;         for(int k=0;k<m;k++)         {             cin>>s;             ssb = ssb+s[0];         }         if(ssa.compare(ssb)==0) printf("SAME\n");         else printf("DIFFERENT\n");         ssa = "";         ssb = "";     }     return 0; } 

printf比cout速度快!


Image Transformation

http://acm.zju.edu.cn/網(wǎng)上第 2857 題

把 RGB 圖像轉(zhuǎn)換為灰度圖像的一
種最簡便的方法是:把一個像素的紅、綠和藍(lán)的值都設(shè)置為一個相同的值(即(r+g+b)/3,
這里假定(r+g+b)總能被 3 整除)。
你決定編寫一個程序來測試這種方法的有效性。

思路:統(tǒng)計每個通道的值,除以像素的個數(shù)。

C++實現(xiàn):

#include <iostream> #include <fstream> #include <string> #include <vector> using namespace std;  int main() {     //ifstream cin("aaa.txt");     vector<int> r;     vector<int> g;     vector<int> b;     int n,m;     int rr,gg,bb;     int w = 0;     while(cin>>n>>m)     {         r.clear();         g.clear();         b.clear();         w++;         if(n==0 && m==0) break;         for(int i=0;i<n*m;i++)         {             cin>>rr;             r.push_back(rr);         }         for(int j=0;j<n*m;j++)         {             cin>>gg;             g.push_back(gg);         }          for(int k=0;k<n*m;k++)         {             cin>>bb;             b.push_back(bb);         }         cout<<"Case "<<w<<":"<<endl;         for(int p=0;p<n*m;p++)         {             cout<<(r[p]+g[p]+b[p])/3;             if((p+1)%m==0) cout<<endl;             else cout<<",";         }     }     return 0; } 


Error Correction

http://acm.zju.edu.cn/網(wǎng)上第 1949 題


一個布爾矩陣有一種奇偶性,即該矩陣所有行和所有列的和都是一個偶數(shù)。

編寫一個程序,讀入這個矩陣并檢查它是否具有奇偶性。如果沒有,你的程序應(yīng)當(dāng)再檢查一下它是否可以通過修改一位(把 0 修改為 1,把 1 修改為 0)來使它具有奇偶性。如果不可能,這個矩陣就被認(rèn)為是破壞了。


思路:統(tǒng)計矩陣中行和列中1的個數(shù),判斷是否為偶數(shù)。

都為偶數(shù)的話,說明有奇偶性,否則再判斷,當(dāng)只有一行的和是奇數(shù)且只有一列的和為奇數(shù),那么,將這兩行交點處的元素修改一下,就變成具有 parity property(奇偶性)的矩陣了。這里還要清楚的一點是,在一個矩陣中,任何一行與任何一列都有且僅有一個交點。

C++實現(xiàn):

#include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; int matrix[100][100]; int SL[100]; int SC[100];  int main() {     ifstream cin("aaa.txt");     int i,j,PL,PC,CountL,CountC;     int n;     while(cin>>n)     {         if(n==0) break;         PL = 0;         PC = 0;         CountL = 0;         CountC = 0;         for(i=0;i<n;i++)         {             SL[i] = 0;             SC[i] = 0;         }         for(i=0;i<n;i++)         {             for(j=0;j<n;j++)             {                 cin>>matrix[i][j];                 SL[i]=SL[i]+matrix[i][j];                 SC[j]=SC[j]+matrix[i][j];             }         }         for(i=0;i<n;i++)         {             if(SL[i]%2!=0)             {                 PL=i;//Record the row                 CountL++;             }              if(SC[i]%2!=0)             {                 PC=i;//Record the line                 CountC++;             }         }         //Output result         if(CountL == 0&&CountC==0) cout<<"OK"<<endl;         else if(CountL==1 && CountC==1) cout<<"Change bit ("<<PL+1<<","<<PC+1<<")"<<endl;         else cout<<"Corrupt"<<endl;     }     return 0; } 


打完收工,故事還在繼續(xù)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI