标签:酒店 lse sizeof void 情况 等于 数组 def bre
A:每家酒店两侧最多都可以建这个新酒店,将两酒店之间距离不合法的情况减去即可,数组都不用开。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,d,a,s,b;
cin>>n>>d>>a;
s=n<<1;
while(--n)
{
b=a;
cin>>a;
s-=(a-b<=d<<1)+(a-b<d<<1);
}
cout<<s;
return 0;
}
B:\(01\) 个数乘积最大?两数和相等,很明显两数越相近乘积越大,这里补一个证明:
设当前两数分别为 \(x\) 和 \(y\),\(x\leq y\)。
\(xy-(x-1)(y+1)=xy-xy-x+y-1=y-x+1>0\)
得证。
于是乎间隔着放 0
和 1
。
#include<bits/stdc++.h>
using namespace std;
#define For(i,x,y)for(i=x;i<=y;i++)
int main()
{
int n,i;
cin>>n;
For(i,1,n)putchar((i&1)+'0');
return 0;
}
C:倒着扫,不考虑两数相同的数对,记录数字种数 \(total\) 和每种数字之前匹配到的数对个数 \(number\),第 \(i\) 个点作为第一个数字的贡献即为 \(total-number\)。最后记得加上两数相同的数对。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 100005
#define For(i,x,y)for(i=x;i<=y;i++)
#define Down(i,x,y)for(i=x;i>=y;i--)
int tot[N],a[N],c[N];
int main()
{
ll s;
int n,i,now,tmp;
s=now=0;
scanf("%d",&n);
For(i,1,n)scanf("%d",&a[i]);
Down(i,n,1)
{
c[a[i]]++;
if(tot[a[i]])s+=now-tot[a[i]];
else s+=now++;
tot[a[i]]=now;
/*printf("%I64d\n",s);*/
}
For(i,1,n)
if(c[i]>1)s++;
printf("%I64d",s);
return 0;
}
D:先看出这是曼哈顿距离。假设矩阵无穷大,那么环绕着的数字个数为 \(4,8,12...\),菱形边长每次加一。所以可以算出第一个越过边界的数字是什么。因为相对位置没有要求,所以这个数字可以看做是 \(min(x,y)\)。暴力枚举 \(n,m\),因为 \(n\times m=t\) 所以这是 \(\sqrt t\) 的。自然可以推出这么一个式子 \(n+m-x-y\) 等于序列中最大的数 \(z\)。现在我们知道了什么?若 \(x\leq y\),则知道了\(n,m,x,z\),所以可以算出\(y\)。然后暴力算出整个矩阵的数进行对比。总复杂度 \(\mathcal O(t\sqrt t)\)。
需要注意的是,\(n\) 不一定小于等于 \(m\),\(x\) 不一定小于等于 \(y\),否则会 Wa On Test36。
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
#define Max(x,y)(x>y?x:y)
#define For(i,x,y)for(i=x;i<=y;i++)
#define Memc(i,j)memcpy(i,j,sizeof i)
int a[N],b[N];
int read()
{
int A;
bool K;
char C;
C=A=K=0;
while(C<'0'||C>'9')K|=C=='-',C=getchar();
while(C>'/'&&C<':')A=(A<<3)+(A<<1)+(C^48),C=getchar();
return(K?-A:A);
}
inline void sw_ap(int&_,int&__)
{
_^=__^=_^=__;
}
int main()
{
bool rem;
int t,i,mx=0,n,m,x,y,mn,j;
t=read();
For(i,1,t)
{
x=read();
a[x]++;
mx=Max(mx,x);
}
if(a[0]!=1)cout<<-1,exit(0);
For(i,1,t)
if(a[i]>i<<2)cout<<-1,exit(0);
else if(a[i]<i<<2)break;
mn=i;
/*cout<<mn<<endl;*/
For(n,1,t)
if(!(t%n))
{
m=t/n;
x=mn;
y=m+n-x-mx;
/*cout<<n<<' '<<m<<' '<<x<<' '<<y<<endl;*/
if(x<0||x>n||y>m)continue;
Memc(b,a);
rem=0;
For(i,1,n)
For(j,1,m)
{
a[abs(i-x)+abs(j-y)]--;
if(a[abs(i-x)+abs(j-y)]<0)
{
rem=1;
break;
}
if(rem)break;
}
if(!rem)cout<<n<<' '<<m<<endl<<x<<' '<<y,exit(0);
Memc(a,b);
}
cout<<-1;
return 0;
}
标签:酒店 lse sizeof void 情况 等于 数组 def bre
原文地址:https://www.cnblogs.com/May-2nd/p/12505807.html