2020.03.14 BAPC 2019 Preliminaries

A题:

思路:只要找出两行各自的最大值比较就可以,若相同就可行。

I题:给n个数,找出一个数k,使得位置为1~k的平方和与位置为k+1~n的和的乘积最大。

思路:数据过大,暴力的话肯定会超时,队友想到了用前缀和。算前缀和和前缀平方和

代码:

#include <bits/stdc++.h>
using namespace std;
ll a[1000010];
ll b[1000010];
int main()
{
    int n,num;
    ll maxnum = -1;
    scanf("%d",&n);
    for(int i = 1;i <= n;i++){
        scanf("%d",&num);
        a[i] = a[i-1] + num;
        b[i] = b[i-1] + num * num;
    }
    for(int k = 1;k <= n-1;k++){
        ll sum1 = b[k];
        ll sum2 = a[n] - a[k];
        maxnum = max(maxnum ,sum1*sum2);
   }
    printf("%lld\n",maxnum);
    return 0;
}

F题:

思路:想到m2 - k2 = (m-k)(m+k) 所以(m-k),(m+k)是n的因子。

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,x,k;
    cin >> n;
    for(x = 1; x <= sqrt(n);x++){
        if(n % x == 0 && (n/x - x) % 2 == 0 ){
            k = (n/x - x)/2;
            break;
        }
    }
    if(x > sqrt(n))
        cout << "impossible" << endl;
    else
        cout << x+k << " " << k << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/pioneerjiesen/p/12527653.html