Codeforces Round #703 (Div. 2)

传送门

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| x1x2+y1y2

做这道题之前先做一下货仓选址这道题。该问题是在一维上,让你求的是把货仓建在某个地方使得所有商店到货仓距离之和最小。求最小值。

分析:对于两个坐标a,b。假设货仓x那么d= ∣ a − x ∣ + ∣ b − x ∣ > = ∣ a − b ∣ |a-x|+|b-x|>=|a-b| ax+bx>=ab。可以发现x在a和b中间它的值是d= ∣ a − b ∣ |a-b| ab,之后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|)+... a1x+a2x+...+anx=(a1x+anx)+(an1x+a2x)+...

对于第一个我们肯定放在a1和an之间,第二个括号肯定放在 a n − 1 a_{n-1} an1和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;
}

猜你喜欢

转载自blog.csdn.net/qq_43566782/article/details/113872961
今日推荐