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;
}