請不要直接抄寫程式碼! 也請不要直接跳到程式碼部分,除非你已經寫好了,想要參考別人的寫法!
第二題
- 此次解題用到
STL
中的set
, 需要引入<set>
這個函式庫 set
意思是集合
, C++ 中的set
跟數學上的集合
很像set
中不會有重複的元素- 但是
set
會自動由小到大排序
STL
中有一個find
函式,意思就是尋找該容器中是否存在這個數值,回傳值為iterator
- 其他就是單純邏輯運算
- 查詢
<algorithm>
函式庫,會有意想不到的答案
※ 雖然 set
很好用,但是對於 C++ 初學者較難理解,所以先用 array
實作 set
看看喔!
程式碼大概如下:
#include <iostream>
#include <set>
using namespace std;
void printAnd(set<int> a, set<int> b);
void printOr(set<int> a, set<int> b);
void printNot(set<int> a, set<int> b);
void printXor(set<int> a, set<int> b);
void printSet(set<int> a);
int main()
{
set<int> setA;
set<int> setB;
int a,b;
cin>>a>>b;
for (int i=0;i<a;i++) {
int temp;
cin>>temp;
setA.insert(temp);
}
for (int i=0;i<b;i++) {
int temp;
cin>>temp;
setB.insert(temp);
}
char symbol;
while (cin>>symbol) {
switch (symbol) {
case 'A':
case 'a':
printAnd(setA,setB);
break;
case 'O':
case 'o':
printOr(setA,setB);
break;
case 'N':
case 'n':
printNot(setA,setB);
break;
case 'X':
case 'x':
printXor(setA,setB);
break;
default:
break;
}
}
}
void printAnd(set<int> a, set<int> b) {
set<int> result;
set<int>::iterator it,temp;
for (it=b.begin();it!=b.end();it++) {
temp = a.find(*it);
if (temp!=a.end())
result.insert(*temp);
}
printSet(result);
}
void printOr(set<int> a, set<int> b) {
set<int>::iterator it;
for (it=b.begin();it!=b.end();it++) {
a.insert(*it);
}
printSet(a);
}
void printNot(set<int> a, set<int> b) {
set<int>::iterator it;
for (it=b.begin();it!=b.end();it++) {
a.erase(*it);
}
printSet(a);
}
void printXor(set<int> a, set<int> b) {
set<int> temp;
set<int>::iterator it,itTemp;
// and
for (it=b.begin();it!=b.end();it++) {
itTemp = a.find(*it);
if (itTemp!=a.end())
temp.insert(*itTemp);
}
// or
for (it=b.begin();it!=b.end();it++) {
a.insert(*it);
}
for (it=temp.begin();it!=temp.end();it++) {
a.erase(*it);
}
printSet(a);
}
void printSet(set<int> a) {
set<int>::iterator it;
for (it=a.begin();it!=a.end();it++) {
if (it==a.begin())
cout<<*it;
else
cout<<" "<<*it;
}
cout<<endl;
}
第三題
- 這題可以上網查查看
最大連續整數和
,有相關的演算法 - 但不用害怕!我們來簡單化!
- 因為要最大和,所以
負數
不加
-2 5 1 4 -3 1 -10 // 原陣列
-2 5 6 10 -3 1 -10 // 整數和陣列
- 先將
index
指向1
- 判斷前面一位是否為
正數
,是就把當前的數值加前一位數值 - 最後判斷是否為當前最大值,就結束一 round
- 小提示:上方的
6 = 5 + 1
、10 = 6 + 4 = 5 + 1 + 4
- 題目還有一個要求,全都負數就輸出
0
,這部分比較簡單,就交給你想囉!
程式碼大概如下:
#include <iostream>
using namespace std;
int main()
{
int times;
int arr[5000];
cin>>times;
while (times--) {
int n;
cin>>n;
for (int i=0;i<n;i++)
cin>>arr[i];
bool isNegative = true;
for (int i=0;i<n;i++) {
if (arr[i]>0) {
isNegative = false;
break;
}
}
int maximum = -1001;
for (int i=1;i<n;i++) {
if (arr[i-1]>0)
arr[i] += arr[i-1];
if (arr[i] > maximum)
maximum = arr[i];
}
if (isNegative)
cout<<"0"<<endl;
else
cout<<maximum<<endl;
}
}
如果有任何問題,歡迎私訊跟我討論喔!