列表

详情


NC214452. 砍竹子

描述

prophet有一片竹林。

当初,他在种植时,把共棵竹子种成n排,m列,

一段时间后,由于水分、光照和养分不均等原因,每棵竹子的长势各不相同。

这使得整个竹林看上去参差不齐。

于是prophet就决定把所有竹子砍成同样的高度。

但prophet属实是一个古怪的人,他不打算用寻常的方法来完成这一目标。

他制定了这样一个规则,每次他都会选取一棵竹子,他会将这棵竹子砍成原本一半的高度。假设这棵竹子的高度为height,那么砍完后这棵竹子的高度就成了。(代表对向下取整,即只取的整数部分)

同一棵竹子可以被砍多次。

现在prophet会重复这个操作,直到所有竹子高度相同为止。

并且他会尽量使得最后竹林的高度最高。你能找到这个高度吗?

输入描述

输入共n+1行。

第一行两个正整数代表竹林大小。

接下来n行,每行m个正整数,代表每颗竹子的初始高度。

输出描述

输出共一行一个整数代表答案

示例1

输入:

2 2
7 29
13 6

输出:

3

说明:

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(gcc 7.5.0) 解法, 执行用时: 116ms, 内存消耗: 5000K, 提交时间: 2022-11-13 20:42:04

#include<stdio.h>
int main(void)
{
    int m,n;
    int a,i;
    scanf("%d%d",&n,&m);
    scanf("%d",&a);
    for(i=1;i<n*m;i++)
    {   
        int b;
        scanf("%d",&b);
        while(a!=b)
        {
            if(a>b)a/=2;
            else b/=2;
        }
    }
    printf("%d",a);
}

C 解法, 执行用时: 120ms, 内存消耗: 4240K, 提交时间: 2023-03-25 21:49:55

#include<stdio.h>
int main() {
	int a[10000005];
	int n, m, t;
	scanf("%d %d", &n, &m);
	scanf("%d", &t);
	for (int i = 2; i <= n * m; i++) {
		scanf("%d", &a[i]);
		while (t != a[i]) {
			if (t > a[i]) t /= 2;
			else a[i] /= 2;
		}
	}
	printf("%d\n", t);

	return 0;
}

C++ 解法, 执行用时: 247ms, 内存消耗: 416K, 提交时间: 2021-10-10 21:13:18

#include<bits/stdc++.h> 
using namespace std;
const int mod=1000010;
int main(){
	int n,m,a;
	cin>>n>>m;
	cin>>a;
	for(int i=1;i<n*m;i++){
		int b;
		cin>>b;
		while(a!=b){
			if(a>b){
				a/=2;
			}
			else b/=2;
		}
	}
	cout<<a;
	return 0;
}

上一题