列表

详情


NC231677. 将idea煎至两面金黄

描述

    众所周知sulp_hsalF经常在牛客出题,以换取喜欢的蝴蝶结。马上就是新的一年了,此时sulp_hsalF又想出了一个新的好idea。但是他为了想这个idea饿坏了肚子,由于家里实在没有吃的了,他决定让你将这个idea煎起来给他当夜宵。

    一个好的idea具有两面性并且蕴有数学的芳香,所以可以看作两面 n * n 的矩阵(如同两层叠在一起的肉饼)。矩阵的每一个元素aij代表idea在该点的成熟度 ,同时,当某个点的成熟度超过2147483647后,他会因为过于成熟而回归稚拙,即 aij = aij - 4294967296

   sulp_hsalF拥有一个开启后会不断增强火力的微波煎锅,这个神奇的煎锅会加热物品(使物品成熟),且在t秒时加热的幅度 F(t) 和煎锅已开火的时间 t 的关系为 F(t) = t。当将idea任意一面朝下放至锅中煎时,idea朝下的一面矩阵将受到100%的热量,同时这一面的所有矩阵元素将在每个单位时间中提高F(t)的成熟度,另一面的矩阵元素只会收到50%的热量,提高F(t) / 2.0的成熟度。你可以随时翻面(翻面不消耗时间,但你的翻面一定在单位时间的间隔处进行)。~现在sulp_hsalF要去睡一觉,他希望醒来时可以吃到一份至少有一个点成熟度为2022的金黄idea。你可以在最短的时间内做出这样一份黄金idea吗

输入描述

第一行一个正整数n,表示矩阵的大小 其中 n ≤ 522。
接下来n * 2行,每行n个以空格分割整数aij,表示矩阵的元素值,前n行和后n行分别表示2面矩阵,-2147483648 ≤ aij ≤ 2147483647

输出描述

如果可以做出,那么输出一个整数,即 最短的时间t 否则 输出 \n

示例1

输入:

2
2000 2019
2023 2023
2023 2023
2023 2023

输出:

2

说明:

将有2019的那一面朝下煎2个单位时间即可
第一个单位时间时,idea变成如下状态
2001 2020             
2024 2024
2023.5 2023.5
2023.5 2023.5
第二个单位时间时,idea变成如下状态
2003 2022             
2026 2026
2024.5 2024.5
2024.5 2024.5

示例2

输入:

1
2021
2022

输出:

0

说明:

已经是2022啦

原站题解

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

pypy3 解法, 执行用时: 425ms, 内存消耗: 30180K, 提交时间: 2021-12-31 22:24:00

def iint():
    ans=[]
    sc=input().split()
    for i in range(0,len(sc)):
        ans.append(int(sc[i]))
    return ans

def ilist():
    return list(input())

n=iint()[0]
ans=1000000000000000000
for i in range(0,n*2):
    a=iint()
    for j in range(0,n):
        g=2022-a[j]
        if g<0:
            g+=4294967296
        g*=2
        l=0
        r=g
        while l<r:
            m=(l+r)>>1
            if m*(m+1)>=g: 
                r=m
            else:
                l=m+1
        ans=min(ans,r)
print(ans)

C++ 解法, 执行用时: 64ms, 内存消耗: 396K, 提交时间: 2022-01-03 15:18:26

#include<bits/stdc++.h>
using namespace std;
int n;long long MIN;
int main(){
	scanf("%d",&n);MIN=1e18;
	for(int i=1;i<=2*n;i++)
	for(int j=1;j<=n;j++){
		long long num;scanf("%lld",&num);
		if(num<=2022ll) MIN=min(MIN,2022ll-num);
		else MIN=min(MIN,2147483648ll+2022ll+(2147483647ll-num));
	}
	for(int i=0;;i++){
		MIN-=i;
		if(MIN<=0){printf("%d\n",i);break;}
	}
	return 0;
}

上一题