# **UVa 10125 Sumsets**
今天解了一題UVa的題目
*UVa 10125 Sumsets*
## 題目敘述如下:
### **Description**
Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S.
### **Input**
Several S, each consisting of a line containing an integer 1 ≤ n ≤ 1000 indicating the number of elements in S, followed by the elements of S, one per line. Each element of S is a distinct integer between -536870912 and +536870911 inclusive. The last line of input contains 0.
### **Output**
For each S, a single line containing d, or a single line containing "no solution".
| Sample Input | Sample Output |
| ------------------ | ------------- |
| 5 <br> 2 3 5 7 12 | 12 |
| 5 <br> 2 16 64 256 1024 |no solution|
## 解題心得
本題使用*set*這種stl,因為在set中資料會排序好。
接著,假設最大值是答案,找出剩下的資料中是否有三個值相加等於答案。這邊用三個for迴圈即可。
:::warning
本題用 *O(n^3^)* 的解法是可行的
:::
## 程式碼
```
#include <iostream>
#include <set>
#define no "no solution"
using namespace std;
int main()
{
int s;
set<int> gather;
int d;
while (1)
{
//輸入
cin >> s;
if (s == 0)
{
break;
return 0;
}
int var;
gather.clear();
for (int i = 0; i < s; i++)
{
cin >> var;
gather.insert(var);
}
int ans = 0;
int a = 0, b = 0, c = 0;
bool found = false;
for (auto it1 = gather.rbegin(); it1 != gather.rend(); it1++)//找出最大值設為答案
{
d = *it1;
for (auto it2 = gather.begin(); it2 != gather.end(); it2++)//找出第一個數字
{
if (*it2 == d) continue;
for (auto it3 = next(it2); it3 != gather.end(); it3++)//找出第二個數字
{
if (*it3 == d) continue;
for (auto it4 = next(it3); it4 != gather.end(); it4++)//找出第三個數字
{
if (*it4 == d) continue;
if (*it2 + *it3 + *it4 == d)判斷答案
{
ans = d;
found = true;
break;
}
}
if (found)
{
break;
}
}
if (found)
{
break;
}
}
if (found)
{
break;
}
}
if (found)
{
cout << ans << endl;
}
else
{
cout << no << endl;
}
}
}
```
:::info
這邊我遇到一個小問題
```
if (found)
{
break;
}
```
我一開始是利用ans != 0來判斷是否有找到答案
```
if (ans != 0)
{
break;
}
```
但我沒想到的是,測資中會出現答案為0的狀況,導致我遇到了好幾個WA。
:::
本提到這邊結束~~