csu 1779 错误的算法

来源:互联网 发布:医学统计学软件 编辑:程序博客网 时间:2024/05/18 14:11

1779: 错误的算法

        Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 387     Solved: 152    

Description

有道题目是这样的:

输入一个 行 列网格,找一个格子,使得它所在的行和列中所有格子的数之和最大。如果答 案不唯一,输出任意解即可。比如,在下面的例子中,最优解是(1,3),即第一行和的三列的交 点(行从上到下编号为 1~n,列从左到右编号为 1~m),所有 个数之和为 35

快要比赛的时候,有一个裁判想到了这样一个算法: 

首先找一行 r(1<=r<=n) 使得该行所有数之和最大,然后找一列 c(1<=c<=m) 使得该列 所有数之和最大,最后直接输出(r,c)如果有多个满足条件的 r,输出最小的 r。对 于 同样处理。

显然,这个算法是错的,但它竟然通过了大部分测试数据!你能找出那些让这个错误算法得到 正确结果的“弱”数据,以便裁判们改进这些数据吗?

Input

输入包含不超过 100 组数据。每组数据第一行为两个整数 n, m (1<=n<=500, 1<=m<=500),即行 数和列数。以下 n 行每行包含 m 个 1~100 的整数。输入的总大小不超过 2MB。

Output

对于每组数据,如果错误算法能得到正确结果,输出"Weak",否则输出"Strong"。

Sample Input

4 45 5 5 51 1 5 11 1 5 11 1 5 15 42 5 1 11 1 9 11 1 1 11 1 1 11 1 1 1 

Sample Output

Case 1: WeakCase 2: Strong

Hint

Source

湖南省第十一届大学生计算机程序设计竞赛

错误的算法之所以错误是算了两遍行与列相交的那个数,知道了这一点并不难

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int maxx,n,m;int b[505],c[505],a[505][505];int f(){    for(int i=0; i<n; i++)        {            for(int j=0; j<m; j++)            {                if(b[i]+c[j]-a[i][j]>maxx)                {                    return 0;                }            }        }        return 1;}int main(){    int count=0;    while(scanf("%d%d",&n,&m)!=EOF)    {        count++;        memset(b,0,sizeof(b));        memset(c,0,sizeof(c));        for(int i=0; i<n; i++)        {            for(int j=0; j<m; j++)            {                scanf("%d",&a[i][j]);                b[i]+=a[i][j];                c[j]+=a[i][j];            }        }        int maxb=b[n-1];        int maxc=c[m-1];        int b1=n-1;        int c1=m-1;        for(int i=n-2; i>=0; i--)        {            if(maxb<=b[i])            {                maxb=b[i];                b1=i;            }        }        for(int j=m-2; j>=0; j--)        {            if(maxc<=c[j])            {                maxc=c[j];                c1=j;            }        }         maxx=b[b1]+c[c1]-a[b1][c1];         if(f())         {             printf("Case %d: Weak\n",count);         }         else         {             printf("Case %d: Strong\n",count);         }    }    return 0;}