歡迎使用CSDN markdown編輯器

2021-08-08 12:59:48 字數 1315 閱讀 6213

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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...