题目链接:L-夜暗方显万颗星,灯明始见一缕尘_第十八届西南科技大学ACM程序设计竞赛(同步赛) (nowcoder.com)
人不该太清醒,过去的事情就让它过去,不必反复咀嚼。一生不长,重要的事儿也没那么多。天亮了,又赚了。自认为迷惑的时候,往往才能看清方向与人生美好的可贵与价值意义。
顺应生活之路,无论走向哪种极端,我们都会在不一样的处境找到不一定的答案,从而不断平衡自己。我们需要这样一种能力,也需要去选择认同。自认为不错的时候,往往可以瞥见我们人生生活上本来存在的不足。
浩瀚星辰,万里银河;红烛微尘,夜临灯始。我们把这个夜空看做一个二维平面,则以某一点为原点建立一个笛卡尔坐标系。坐标系内有以下物体:"星"、"尘"、"灯"。
①:"星"是一个 n×m 的矩形区域,它能够发出光芒。其左下角顶点坐标为 (0,0) ,右上角顶点坐标为 (n,m)。
②:"尘"是一个 x×y 的矩形区域,它可以也必须完全放置在"星"的表面之上,遮蔽"星"所发出的光芒。保证"尘"至少有一种完全放置在"星"的范围内的方法。
③:"灯"是"尘"遮蔽了"星"之后,"星"剩下的部分 (剩余部分通常是 "L" 型或 "一字" 型) 。
"灯"中的每一个矩形都能为"灯"提供 1 点能量。给定"星"的位置和"尘"的大小,请制订一个放置"尘"的方案,使得"灯"能提供的总能量最多,求出这个最多的总能量数。("尘"必须完全放置在"星"的范围内,即:"尘" ∪ "星" = "星" 且 "尘" ∩ "星" = "尘" )
输入描述:
输入仅一行,输入 4 个正整数 n,m,x,y (1≤n,m≤103,1≤x,y≤min(n,m)),分别表示"星"的区域以及"尘"的大小。
输出描述:
输出仅一个整数,表示"灯"最多可以提供的总能量数。
示例1
输入
1 3 1 1
输出
3
示例2
输入
2 3 1 2
输出
9
这是一个结论题,队伍在打比赛时被卡了好久,第一眼看起来像是一个递推,在这里有一个结论。
首先,题目要求的是在大矩形边长分别为(n,m)中加入一个小矩形(x,y),求剩余部分的矩形的子矩形的最多的数量。
首先需要推断出,证明就不放了,需要用到均值不等式且比较繁琐(我不会)。其实不难看出将这个小矩形放在角落应该是最合适的,能够方便其他图形连成片,使得总数最多。
所以最大值就变成了两者之一。也就是大矩形的长和小矩形长同向,或者大矩形和小矩形的长垂直。
剩余部分是一个“L”形或者特殊情况是一个矩形。L形的矩形数量可以通过用两个大矩形减去中间共有的小矩形的子矩形数量求得。
故在此封装函数,便于求在矩形中的子矩形的数量。
将矩形看成一维的,总数就是n*(n+1)/2。若将其看成二维,则是(n*(n+1)/2)*(m*(m+1)/2)。
代码如下:
#include<iostream>
using namespace std;
typedef long long ll;
ll get(ll x)
{return x*(x+1)/2;
}
ll sum(ll n,ll m)
{ll res=get(n)*get(m);return res;
}
ll maxn=0;
int main()
{ll n,m,x,y;cin>>n>>m>>x>>y;if(n>=x&&m>=y){maxn=sum(n-x,m)+sum(n,m-y)-sum(n-x,m-y);}//cout<<maxn;if(n>=y&&m>=x){maxn=max(maxn,sum(n-y,m)+sum(n,m-x)-sum(n-y,m-x));}cout<<maxn;return 0;
}