A. Maximum Neighborhood
ideas:
找规律,我们会发现对于任意一个数的价值是由"上,下,左,右"和他自己的总和
k-n
k-1 k k+1
k+n
总价值就是k*5
去除边界的特殊情况即可。
code:
cpp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
void solve()
{
int n;
cin>>n;
int res=0;
int k=1,ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
ans=k*5;
if(i==0)ans-=k-n;
if(i==n-1)ans-=k+n;
if(j==0)ans-=k-1;
if(j==n-1)ans-=k+1;
res=max(res,ans);
k++;
}
}
cout<<res<<endl;
}
int main ()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t=1;
cin>>t;
while(t--)
solve();
return 0;
}
B. Addition on a Segment
ideas:
起初一个全为0的数组,对它进行n次操作,每次选择一个区间,区间里的每一个数+1,问最长的区间长度。
首先我们看0,0所在的位置是不会被操作的,我们尽量放到一边去,这样才能最大化操作区间长度
其次我们看后面不为0的数,如果每次只操作一个长度为1的区间,最后他们的和一定为n,那么不为n(只能大于n),则就说明有更长的操作区间,于是长度为
sum−n+1sum-n+1sum−n+1
最后要于这两个约束求最小。
code:
cpp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
void solve()
{
int n;
cin>>n;
ll sum=0,cnt=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
sum+=x;
if(x==0)cnt++;
}
ll ans=min(sum-n+1,n-cnt);
cout<<ans<<endl;
}
int main ()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t=1;
cin>>t;
while(t--)
solve();
return 0;
}
C. Quotient and Remainder
ideas:
我们要进行qr匹配,通过题目的要求进行数学推到:
q=x/y&&r=xmodyq=x/y\&\&r=xmodyq=x/y&&r=xmody
x=q∗y+r(1<=y<x<=k)q∗y+r<=kr<y \begin{gathered} x=q*y+r(1<=y<x<=k) \\q*y+r<=k \\r<y \end{gathered} x=q∗y+r(1<=y<x<=k)q∗y+r<=kr<y
关于第三个不等式:
r=xmody,r就不可能比y
于是我们可以得出r的表达式:
我们要去匹配
qr所以要建立他们的关系式
显然得出y的表达式是毫不费力的,我们再根据第三个不等式,即可得出:
r<kq+1 r< \frac{k}{q+1} r<q+1k
这里好像得到了我们想要的关系式,仔细想想这只有对
y的约束
对x的约束:
q∗(r+1)+r<kr<k−qq+1 q*(r+1)+r<k\\ r<\frac{k-q}{q+1} q∗(r+1)+r<kr<q+1k−q
这个约束是由
y的约束得过来的
于是我们得到了完整的qr的关系,通过双指针的查找即可。
code:
cpp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
void solve() {
ll n, k;
cin >> n >> k;
vector<ll> q(n), r(n);
for (int i = 0; i < n; i++) cin >> q[i];
for (int i = 0; i < n; i++) cin >> r[i];
vector<ll> a;
for (int i = 0; i < n; i++) {
a.push_back((k - q[i]) / (q[i] + 1));
}
sort(a.begin(), a.end());
sort(r.begin(), r.end());
ll cnt = 0;
int j = 0;
for (int i = 0; i < n && j < n; i++) {
if (r[j] <= a[i]) {
cnt++;
j++;
}
}
cout << cnt << endl;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin >> t;
while (t--) solve();
return 0;
}