列表

详情


NC208114. 宝藏男孩

描述

       小明是一个喜欢探险的小孩,有一天,他的外婆带他去了一个大小为n×n网格的森林里,其中n是奇数(不能被2整除),每个格子中,都放有一个宝藏,他想把这些宝藏都集中到同一个单元格中。但是,小明正沉迷于探险小说,所以想请你帮帮他。你的任务是找到所有宝藏进入一个单元格(即n2-1单元格应该包含0个宝藏,而一个单元格应该包含n2图形)所需的最小移动次数。

       在一次移动中,你可以选择某个单元格中的一个宝藏,并将其移动到与当前单元格共享边或角的单元格中,也就是说,从单元格(i,j)你可以将其中的宝藏移动到以下单元格中:

·        (i−1,j−1);

·        (i−1,j);

·        (i−1,j+1);

·        (i,j−1);

·        (i,j+1);

·        (i+1,j−1);

·        (i+1,j);

·        (i+1,j+1);

       另外,你还需注意:
            第一:你不能将宝藏移出森林。
            第二:一个网格中存放多个宝藏是被允许的。



输入描述

输入:

第一行输入一个整数t (1≤t≤200),表示测试用例的数量。接下来的t行每行包含一个整数n (1≤n<5*105)表示网格规模。题目保证n全为奇数且所有测试用例中n的总和不超过5*105,即∑n≤5*105

输出描述

输出:

每一行测试用例包含一个答案,即所需的最小移动次数。

示例1

输入:

3
1
5
499993

输出:

0
40
41664916690999888

原站题解

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

Python(2.7.3) 解法, 执行用时: 75ms, 内存消耗: 10848K, 提交时间: 2020-06-20 13:50:23

def main():
    n = int(raw_input())
    m = (n - 1) // 2
    ans = 0
    for i in range(1 , m + 1):
        c = (2 * i + 1) * (2 * i + 1) - (2 * i - 1) * (2 * i - 1)
        ans += c * i
    print ans
        
t = int(raw_input())
for i in xrange(t):
    main()

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 384K, 提交时间: 2023-03-29 16:15:18

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n;
signed main()
{
    cin>>T;
    while(T--)
    {
        cin>>n;
        int ans=0,tmp=8;
        for(int i=1;i<=n/2;i++)ans+=tmp*i,tmp+=8;
        cout<<ans<<'\n';
    }
    return 0;
}

pypy3(pypy3.6.1) 解法, 执行用时: 193ms, 内存消耗: 55628K, 提交时间: 2020-06-20 13:22:51

from itertools import accumulate
N = 10 ** 6
delta = [(i * 2 + 1) ** 2 - (i * 2 - 1) ** 2 for i in range(N)]
delta[0] = 1
s = list(accumulate((i * delta[i] for i in range(N))))
t = int(input())
for _ in range(t):
    n = int(input())
    print(s[n // 2])

C++14(g++5.4) 解法, 执行用时: 2ms, 内存消耗: 500K, 提交时间: 2020-08-23 11:35:32

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		long long a;
		cin>>a;
		a/=2;
        long long sum=0;
		for(int i=0;i<=a;i++){
			sum+=(long long)i*i*8;
		}
		cout<<sum<<endl;
	}
	return 0;
}

Go(1.9.1) 解法, 执行用时: 3ms, 内存消耗: 1004K, 提交时间: 2020-06-20 14:46:59

package main

import "fmt"

func main()  {
	var n int
	fmt.Scan(&n)
	for i:=0;i<n;i++{
		var x int
		fmt.Scan(&x)
		var res int
		for i:=1;i<=x/2;i++{
			res+=i*((i*2+1)*(i*2+1)-(i*2-1)*(i*2-1))
		}
		fmt.Println(res)
	}


}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 376K, 提交时间: 2020-07-13 15:55:13

#include<iostream>
using namespace std;
int main()
{
	long long i,t,n,l,ans;
	cin>>t;
	while(t--)
	{
		cin>>n;
		ans=0;
		l=(n-1)/2;
		for(i=1;i<=l;i++)
			ans+=8*i*i;
		cout<<ans<<endl;
	}
}

Python3(3.5.2) 解法, 执行用时: 176ms, 内存消耗: 3364K, 提交时间: 2020-07-07 19:02:28

for i in range(int(input())):
    n=int(input())
    k=(n+1)//2
    ans=0
    for j in range(k):
        ans+=(j*min(j,2*k-j-1))
    print(ans*8)
    

上一题