列表

详情


NC19330. 水果蛋糕

描述

BLUESKY007要过生日了,为此朋友们准备给她买一个n*m的水果蛋糕qwq,但是在订蛋糕的时候却出现了问题:
蛋糕是方形的,因为水果颗粒放整齐才好看,所以水果颗粒必须按行按列地摆放(也就是如果建立平面直角坐标系,它们的坐标必须都是整数)。
她的朋友们想要蛋糕店多放点水果,但是由于摆放得太密集也不好看qwq,所以蛋糕店拒绝在和任意的水果颗粒相距的地方摆放水果颗粒。
她的朋友们想知道蛋糕上最多能摆放多少水果颗粒,但是由于她们没有BLUESKY007聪(rui)慧(zhi),所以她们找到了你来帮忙

输入描述

一行两个正整数n,m

输出描述

一行一个整数表示答案

示例1

输入:

1 4

输出:

4

示例2

输入:

3 4

输出:

10

原站题解

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

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 488K, 提交时间: 2018-10-15 08:25:18

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    if(n<3||m<3){printf("%lld\n",1ll*n*m);return 0;}
    if(n>m)swap(n,m);
    if(n==4&&m==4){puts("12");return 0;}
    if(n==4&&m==5){puts("17");return 0;}
    if(n==4)
    {
        int t=m/6,r=m%6;
        long long ans=2ll*m;
        if(r==1||r==2)ans+=2*r;
        else if(r==3||r==4)ans+=4;
        else if(r==5)ans=12ll*(t+1);
        printf("%lld\n",ans);
        return 0;
    }
    if(n==3)
    {
        int t=m/6,r=min(3,m%6);
        long long ans=m+6ll*t+2ll*r;
        printf("%lld\n",ans);
        return 0;
    }
    cout<<(1ll*n*m+1)/2<<endl;
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2020-03-28 20:46:43

#include<iostream>
#define ll long long
using namespace std;
int main()
{
	ll n,m;
	cin>>n>>m;
	if(n<m) swap(n,m);
	if(m<=2) cout<<n*m<<endl;
	else if(m==3) cout<<n+n/6*6+2*min(n%6,3ll)<<endl;
	else if(m==4)
	{
		ll v=n%6;
		if(v==0) cout<<2*n<<endl;
		else if(v==1||v==2) cout<<2*n+2*v<<endl;
		else cout<<2*n+4-(v==5?2:0)<<endl;
	}
	else cout<<((n*m+1)>>1)<<endl;
	return 0;
}

上一题