problem description
gardon昨天給小希布置了一道作業,即根據一張由不超過5000的n(3<=n<=100)個正整數組成的數表兩兩相加得到n*(n-1)/2個和,然後再將它們排序。例如,如果數表裡含有四個數1,3,4,9,那麼正確答案是4,5,7,10,12,13。小希做完作業以後出去玩了一陣,可是下午回家時發現原來的那張數表不見了,好在她做出的答案還在,你能幫助她根據她的答案計算出原來的數表麼?
input
包含多組資料,每組資料以乙個n開頭,接下來的一行有按照大小順序排列的n*(n-1)/2個數,是小希完成的答案。檔案最後以乙個0結束。
假設輸入保證解的存在性和唯一性。
output
對於每組資料,輸出原來的數表。它們也應當是按照順序排列的。
sample input
44 5 7 10 12 13
4 5 6 7 8 9 10
0 sample output
1 3 4 9
2 3 4 6
這道題真的是磨了好久才做啊。好像是暑假在家裡時就看了這道題,到最後回學校了才提交的oj。
思路:輸入輸出都是按從小到大的順序排的,所以sum0=a0+a1,sum1=a0+a2。然後sum3就不能確定了,這時通過列舉找出a1,a2等於sumi,這時就得出了a0,a1,a2.把這三個數的兩兩之和從sum中去掉,剩下的第乙個sumi就是a0+a3了,求出a3,然後再把a3與之前數的兩兩之和都從sum中去掉。剩下的第乙個就是a0+a4了。然後以此類推,就能找出全部的元素。
下面上**
#include
#include
using namespace std;
int main()
//找出a0,a1,a2
for(int i=2;i0]=(sum[0]+sum[1]-sum[i])/2;
a[1]=sum[0]-a[0];
a[2]=sum[1]-a[0];
if(a[1]+a[2]!=sum[i])
sum[0]=0;sum[1]=0;sum[i]=0;
break;
}
int k=2;
for(int i=3;iwhile(sum[k]==0)
a[i]=sum[k]-a[0];
sum[k]=0;
for(int j=1;jint t=k+1;
while(sum[t]!=a[i]+a[j])
sum[t]=0;}}
for(int i=0;i1;i++)
cout<1]0;}
歡迎使用CSDN markdow
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...
歡迎毛毛與妞妞使用CSDN markdown編輯器
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
歡迎使用CSDN markdow1n編輯器
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...