Nguồn đề bài: http://www.spoj.com/PTIT/problems/PTIT136C/
1. Đề bài PTIT136C spoj
Cho trước một dãy số dương có N phần tử. Bạn biết trước tổng của bất kì 2 phần tử nào trong dãy số, hãy tìm dãy số ban đầu.
Input
Dòng đầu tiên là N, số phần tử của dãy số. (2 <= N <= 1000)
N dòng sau, mỗi dòng gồm N số (mỗi số <= 100 000) mô tả ma trận biểu diễn tổng của 2 phần tử trong dãy.
* S(i,j) = 0 nếu i = j.
* S(i,j) = A[i] + A[j] với i ≠ j, là tổng của phần tử thứ i và thứ j trong dãy số.
Output
In ra trên 1 dòng dãy số cần tìm. Input luôn đảm bảo có 1 đáp số duy nhất.
Example
Input1:
2
0 2
2 0
Ouput1:
1 1
Input2:
4
0 3 6 7
3 0 5 6
6 5 0 9
7 6 9 0
Ouput2:
2 1 4 5
2. Gợi ý PTIT136C spoj
– Bài này nếu bạn để ý bạn sẽ dễ dàng nhận thấy, chỉ cần cộng trừ những ô trên bảng cho trước thì sẽ thu được kết quả cho trước :))…=))
2 code tham khảo dưới đây không dùng chung 1 công thức nhưng có ý tưởng giống nhau là dùng công thức để tính… các bạn có thể tham khảo:
3. Code tham khảo PTIT136C spoj
a. Code pascal
const fi=''; nmax=1000; type data=longint; var f:text; A:array[1..nmax,1..nmax] of data; B:array[1..nmax] of data; N:data; procedure docfile; var i,j:data; begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do for j:=1 to n do read(f,a[i,j]); close(f); end; procedure xuli; var i,j:data; begin B[1]:=(A[1,2]+a[1,3]-a[2,3]) div 2; B[2]:=(a[1,2]-a[1,3]+a[2,3]) div 2; write(b[1],' ',b[2],' '); for i:=3 to n do write((A[1,2]-A[1,i]-a[2,i]) div (-2),' '); end; begin docfile; xuli; end.
b. Code c++
#include <iostream> using namespace std; int main() { int n; cin >> n; int a[n+1][n+1],s[n+1][n+1]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin >> a[i][j]; if(n==2) cout << a[1][2]/2 << " " << a[1][2]/2; else { for(int j=2;j<n;j++) { s[j][j+1]=a[1][j]-a[1][j+1]; if(j==2) cout << a[1][2]-(s[j][j+1]+a[j][j+1])/2 << " "; cout << (s[j][j+1]+a[j][j+1])/2 << " "; if(j==n-1) cout << a[j][j+1]- (s[j][j+1]+a[j][j+1])/2; } } }