NBUT 1641 “错误的算法”(这是题目名)

题目:

Description

有道题目是这样的:

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

Sample Output

Case 1: Weak
Case 2: Strong

这个题目,如果思路清晰的话,一开始就能想明白,只需要计算这个矩阵的行和以及列和就可以算出答案,

也就是说,只需要1个2维数组和2个1维数组即可。

然而我是边写代码边发现这个的,就把一些不必要的数组删掉了。

首先输入list,同时统计row和line。

然后计算“错误的算法”算出来的最大值maxx是多少。

然后直接枚举来判断maxx是不是最优解。

代码:

#include<iostream>
#include<string>
#include<string.h>
using namespace std;

int n, m, maxx;
int list[500][500];
int row[500], line[500];

bool ok()
{
	for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)
		if (row[i] + line[j] - list[i][j] > maxx)return false;
	return true;
}

int main()
{
	int cas = 1;
	int keyr, keyl, maxr, maxl;
	while (cin >> n >> m)
	{
		memset(line, 0, sizeof(line));
		memset(row, 0, sizeof(row));
		for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)
		{
			cin >> list[i][j];
			row[i] += list[i][j];
			line[j] += list[i][j];
		}
		keyr = n - 1, keyl = m - 1, maxr = row[n - 1], maxl = line[m - 1];
		for (int i = n - 2; i >= 0; i--)if (maxr <= row[i])
		{
			maxr = row[i];
			keyr = i;
		}
		for (int i = m - 2; i >= 0; i--)if (maxl <= line[i])
		{
			maxl = line[i];
			keyl = i;
		}
		maxx = row[keyr] + line[keyl] - list[keyr][keyl];
		cout << "Case " << cas++ << ": ";
		if (ok())cout << "Weak";
		else cout << "Strong";
		cout << endl;
	}
	return 0;
}
时间: 2024-10-05 23:30:49

NBUT 1641 “错误的算法”(这是题目名)的相关文章

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

贪心算法之经典题目---订票

题目:一票务办公室为音乐会售票,出售某一固定数量的连号票(简称套票).购票订单以该套票中最小的座位号作为标志.由于不能满足所有订单,故而采用:若订单完全满足观众要求的票全价:若订单中至少一个座位与观众要求不同,则半价.现求怎样处理订单,才能使总收入最高.输入为套票里座位数量,订单数以及每个订单对应的座位号(最小的座位号为标志).输出订单处理结果,即处理后的套票号码.(不要求顺序,且输入数据都符合要求,最小座位号为1,订单可以不被接受.) 解题思路: 采用贪心算法,3个步骤: 1)  试图分配尽可

二分&#183;归并排序之逆序对 算法讲解和题目

题目: #1141 : 二分·归并排序之逆序对 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回.上上回以及上上上回里我们知道Nettle在玩<艦これ>.经过了一番苦战之后,Nettle又获得了的很多很多的船.这一天Nettle在检查自己的舰队列表:我们可以看到,船默认排序是以等级为参数.但实际上一个船的火力值和等级的关系并不大,所以会存在A船比B船等级高,但是A船火力却低于B船这样的情况.比如上图中77级的飞龙改二火力就小于55级的夕立改二.现在Nett

三分&#183;三分求极值 算法讲解和题目

题目: #1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d. 提示:三分法 输入 第1行:5个整数a,b,c,x,y.前三个数构成抛物线的参数,后两个数x,y表示P点坐标.-200≤a,b,c,x,y≤200 输出 第1行:1个实数d,保留3位小数(四舍五入) 样例输入 2 8 2 -2 6 样例输出 2

九章算法强化班ladder题目梳理

1 - Follow up in Code Interview kth-smallest-number-in-sorted-matrix Find the kth smallest number in at row and column sorted matrix. [ [1 ,5 ,7], [3 ,7 ,8], [4 ,8 ,9],] 注意点: Comparator<Pair>的实现 PriorityQueue poll add 1 import java.util.*; 2 3 class

进化算法期末考试题目

题目: 小吃店的营业情况 某小吃店供应的一种特色点心很受欢迎,小吃店营业时间是上午8时至下午1时,顾客按表1所示规律到达该店.顾客往往是几个熟人一起来用点心的,经过一段时间的观察,每批顾客的人数如表2所示,每位顾客吃点心的份数如表3所示.每位顾客在小吃店的停留时间见表4,如有几个熟人一起进店用点心,则这群顾客在店中的停留时间是其中吃得最慢的顾客所停留的时间. 表1 顾客到达规律 顾客到达时间间隔/min 3 5 6 8 10 概率P 0.3 0.2 0.15 0.2 0.15 表2 每批顾客数

HNNU 11656 错误的算法【 湖南省第十一届大学生计算机程序设计竞赛,模拟】

原题链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11656&courseid=0 简单模拟,最后判断的时候要比较两种方式得到的最大值是否相等,而不是最大值的坐标!!! AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <

《算法导论》题目和笔记——第二章

2.1-2 1 void insert_sort(vector<int> &v) 2 { 3 for (int i = 1; i < v.size(); ++i) 4 { 5 int key = v[i]; 6 int j = i - 1; 7 while (j >= 0 && key > v[j]) 8 { 9 v[j + 1] = v[j]; 10 --j; 11 } 12 v[j + 1] = key; 13 } 14 }

Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)

leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三个5)或者(一个10一个5),每次都从大的开始找起来 """ class Solution: def lemonadeChange(self, bills) -> bool: five = 0 ten = 0 for i in bills: if i == 5: five