A. Shifting Stacks
给你一个序列,每次可以选择一个 a i ai ai将此值(一次只能操作1)填充到 a i + 1 a_{i+1} ai+1,问操作无限次后能不能让序列严格递增?( 0 = < a i < = 1 0 9 0=<ai<=10^9 0=<ai<=109)。
最低的可能就是{0,1,2,3…}这种序列。一开始直接求前n项和n*(n-1)/2,然后判断序列和大于就是YES否则NO。但是这种0 0 9实际上是不可能的。因为9不能往前加1。所以不可做。换一种方法,我们从1~n构造{0,1,2,3…}然后判断满足递增即可
#include <bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll a[105];
void solve()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
ll sum=0;
for(int i=0;i<n;i++){
cin>>a[i];
}
bool flag=true;
for(int i=0;i<n;i++){
if(a[i]!=i&&i+1<n){
ll temp=a[i]-i;
if(i+1<n){
a[i+1]+=1ll*temp;
a[i]=i;
}
}
if(i+1<n&&a[i]>=a[i+1]){
flag=false;break;
}
}
// for(int i=0;i<n;i++)cout<<a[i]<<' ';
// cout<<'\n';
if(flag)cout<<"YES";
else cout<<"NO";
cout<<'\n';
}
}
int main() {
solve();
return 0;
}
B. Eastern Exhibition
给你一些二维坐标(假设是房屋),问你在坐标轴上找到一些值(商店)满足所有房屋到商店的最短曼哈顿距离(d= ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x1-x2|+|y1-y2| ∣x1−x2∣+∣y1−y2∣)
做这道题之前先做一下货仓选址这道题。该问题是在一维上,让你求的是把货仓建在某个地方使得所有商店到货仓距离之和最小。求最小值。
分析:对于两个坐标a,b。假设货仓x那么d= ∣ a − x ∣ + ∣ b − x ∣ > = ∣ a − b ∣ |a-x|+|b-x|>=|a-b| ∣a−x∣+∣b−x∣>=∣a−b∣。可以发现x在a和b中间它的值是d= ∣ a − b ∣ |a-b| ∣a−b∣,之后x放在左侧或右侧都是比他大的。对于一般情况
∣ a 1 − x ∣ + ∣ a 2 − x ∣ + . . . + ∣ a n − x ∣ = ( ∣ a 1 − x ∣ + ∣ a n − x ∣ ) + ( ∣ a n − 1 − x ∣ + ∣ a 2 − x ∣ ) + . . . |a1-x|+|a2-x|+...+|an-x|=(|a1-x|+|an-x|)+(|a_{n-1}-x|+|a2-x|)+... ∣a1−x∣+∣a2−x∣+...+∣an−x∣=(∣a1−x∣+∣an−x∣)+(∣an−1−x∣+∣a2−x∣)+...
对于第一个我们肯定放在a1和an之间,第二个括号肯定放在 a n − 1 a_{n-1} an−1和a2之间。…最后肯定放在 a n / 2 a_{n/2} an/2和 a n / 2 + 1 a_{n/2+1} an/2+1之间最好(假设n是偶数,n是奇数肯定放中间)。
所以这道题:对于x轴满足情况的也是在 a n / 2 a_{n/2} an/2和 a n / 2 + 1 a_{n/2+1} an/2+1之间的数都符合条件。(奇数只有一种)
#include <bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=1e3+5;
int x[N],y[N];
void solve()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
sort(x+1,x+1+n);
sort(y+1,y+1+n);
if(n&1)cout<<1;
else cout<<1ll*(x[n/2+1]-x[n/2]+1)*(y[n/2+1]-y[n/2]+1);
cout<<'\n';
}
}
int main() {
solve();
return 0;
}