Sicily 9562. SUME

来源:互联网 发布:黑客网络hacknet 攻略 编辑:程序博客网 时间:2024/06/05 17:02

9562. SUME

Constraints

Time Limit: 1 secs, Memory Limit: 256 MB

Description

Once upon a time, there existed a sequence A consisting of N positive integers. You don't know the sequence itself, but you do know the sum of every two elements of the sequence. Find the sequence A!

Input

The first line of input contains the positive integer N (2 ≤ N ≤ 1000).
Each of the following N lines contains N positive integers smaller than or equal to 100 000, forming the table S. The following relations hold: S(i, j) = A[i] + A[j] for i ≠ j, and S(i, j) = 0 for i = j. Here S(i, j) denotes the number in the ith row and jth column of the table, and A[i] denotes the ith element of the sequence A.
It is guaranteed that for any input data set there exists a unique sequence of positive integers A with the given properties.

Output

The first and only line of output must contain the required sequence A (in the form of N space-separated positive integers).

Sample Input

2 0 2 2 0

Sample Output

1 1

Problem Source

2013年每周一赛第十四场

这道题还是蛮好玩的,构造方程,求解,注意这里要构造三个方程,

a[i] + a[j] = s[i][j];
a[j] + a[k] = s[j][k];
a[k] + a[i] = s[k][i];
这样才能求出来,然后发现,其实不用读完全部的数字都可以求解了,于是。。。

第一遍,0.49s:
#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>#include <string>using namespace std;int s[1005][1005];int main() {    int i, j, k, a[1005], n;        scanf("%d", &n);    for (i = 0; i < n; i++) {        for (j = 0; j < n; j++) {            scanf("%d", &s[i][j]);        }    }        memset(a, 0, sizeof(a));    /*for (i = 0; i < n && n >= 3; i++) {        for (j = i + 1; j < n; j++) {            for (k = j + 1; k < n; k++) {                a[i] = (s[i][j] - s[j][k] + s[k][i]) / 2;                a[j] = s[i][j] - a[i];                a[k] = s[i][k] - a[i];            }        }    }*/        if (n >= 3) {        a[0] = (s[0][1] - s[1][2] + s[2][0]) / 2;        a[1] = s[0][1] - a[0];        for (k = 2; k < n; k++) {            a[k] = s[0][k] - a[0];        }    }        if (n == 2) {        printf("1 1\n");    } else {        printf("%d", a[0]);        for (i = 1; i < n; i++) {            printf(" %d", a[i]);        }        printf("\n");    }        return 0;}                                 
第二遍,读入2n + 1个数就可以求解,程序还没输入完成我就输出,能不快吗?也就是第一行第二个数,第二行第三个数,第三行第一个数(0s):

#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>#include <string>using namespace std;int main() {    int i, k, a[2], n, temp, s[1005], s12, s20;        scanf("%d", &n);    /*for (i = 0; i < n; i++) {        for (j = 0; j < n; j++) {            scanf("%d", &s[i][j]);        }    }*/        memset(a, 0, sizeof(a));    /*for (i = 0; i < n && n >= 3; i++) {        for (j = i + 1; j < n; j++) {            for (k = j + 1; k < n; k++) {                a[i] = (s[i][j] - s[j][k] + s[k][i]) / 2;                a[j] = s[i][j] - a[i];                a[k] = s[i][k] - a[i];            }        }    }*/        if (n >= 3) {        for (i = 0; i < n; i++) {            scanf("%d", &s[i]);        }        for (i = 0; i < n + 1; i++) {            scanf("%d", &temp);            if (i == 2)                s12 = temp;            if (i == n)                s20 = temp;        }        a[0] = (s[1] - s12 + s20) / 2;        a[1] = s[1] - a[0];        printf("%d %d", a[0], a[1]);        for (k = 2; k < n; k++) {            printf(" %d", s[k] - a[0]);        }        printf("\n");    }        if (n == 2) {        printf("1 1\n");    }    return 0;}          



0 0
原创粉丝点击