【cf】Restoring Paintie

来源:互联网 发布:java 执行jar包 参数 编辑:程序博客网 时间:2024/05/17 19:18

原题

题意:每个2*2的矩形和都相等,求满足该矩形的方法数。


1.思路:

将其余几个空格从左到右,从上到下为e,f,g,h,i,列出b+e=f+c,b+h=c+i,a+e=h+d,a+f=d+i,即g(正中间的数)可取任何数,所以求出方法数,然后*n。枚举其中一个未知数e,将其他未知数用已知数表示出来,通过for循环求解。

<span style="font-family:SimSun;font-size:18px;"><strong>#include<stdio.h>int main(){int n,a,b,c,d,e,f,g,h,i;while (scanf("%d%d%d%d%d",&n,&a,&b,&c,&d)!=EOF){long long sum=0;for (e=1;e<=n;e++){f = e-c+b;h = a-d+e;i = a-d+f;if ((f>=1&&f<=n)&&(h>=1&&h<=n)&&(i>=1&&i<=n))sum++;}printf("%lld\n",sum*n);} return 0;}</strong></span>
2.思路:

由1,正中间的可取任何数, 假设左上角放的是x,根据可以得到三个方程;
         f: 1<=x+b-c<=n,所以 c-b+1<=x<=c-b+n;
         h:1<=x+a-d<=n,所以d-a+1<=x<=d-a+n;
         i:1<=a+b+x-c-d<=n,所以c+d-a-b+1<=x<=c+d-a-b+n;
          同时1<=x<=n;
          所以x最小可以取cnt1=max(1,c-b+1,d-a+1,c+d-a-b+1);
                  最大可以取cnt2=min(n,c-b+n,d-a+n,c+d-a-b+n);
          如果cnt2<cnt1,没有可行解,答案是0; 否则ans=(cnt2-cnt1+1)*n;

#include<stdio.h>#include<algorithm>using namespace std;int main(){    int n,a,b,c,d,i,cnt1,cnt2;long long ans;    while (scanf("%d%d%d%d%d",&n,&a,&b,&c,&d)!=EOF){    cnt1=max(1,max(max(c-b+1,d-a+1),c+d-a-b+1));    cnt2=min(n,min(min(c-b+n,d-a+n),c+d-a-b+n));    if(cnt2>=cnt1)    ans=(long long)(cnt2-cnt1+1)*n;    else ans=0;    printf("%lld\n",ans);}        return 0; }
3.思路:

#include <iostream>using namespace std;main(){int n,a,b,c,d;cin>>n>>a>>b>>c>>d;cout<<max(n-abs(a-d)-abs(b-c),0)*1ll*n;}



0 0
原创粉丝点击