A题,(水题)因为只每一行每一列的最大值而不知道其他元素的状态所以只需让最大值相等即可;
F题,通过推导公式解决
当时自己推了一个公式,但是错了,代码如下:
#include<bits/stdc++.h> using namespace std; #define LL long long int main() { LL n; cin>>n; LL flag=0,num1,num2; for(int i=1;i<n;i++) { if(n-i*i<0)break; if((n-i*i)%(2*i)==0&&(n+i*i)%(2*i)==0) { flag=1; num1=(n+i*i)/(2*i); num2=(n-i*i)/(2*i); break; } } if(flag==0)cout<<"impossible"; else cout<<num1<<" "<<num2; }
这题是队友过的,赛后看了他的思路,就是解方程组就可,代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <math.h> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <sstream> #include <iostream> #include <time.h> #include <queue> #include <list> #include <map> #include <set> #include <vector> #include <stack> #include <string.h> #include <bitset> #define sf scanf #define pf printf #define lf double #define p123 printf("123\n"); #define pn printf("\n"); #define pk printf(" "); #define p(n) printf("%d",n); #define pln(n) printf("%d\n",n); #define s(n) scanf("%d",&n); #define ss(n) scanf("%s",n); #define ps(n) printf("%s",n); #define sld(n) scanf("%lld",&n); #define pld(n) printf("%lld",n); #define slf(n) scanf("%lf",&n); #define plf(n) printf("%lf",n); #define sc(n) scanf("%c",&n); #define pc(n) printf("%c",n); #define gc getchar(); #define ll long long #define re(n,a) memset(n,a,sizeof(n)); #define len(a) strlen(a) //#define eps 1e-13 #define zero(x) (((x) > 0? (x):(-x)) < eps) using namespace std; #include<iostream> #include<cmath> using namespace std; int main() { ll n,i,q=1; ll x,y; cin>>n; for(i=(ll)(sqrt(n))+1; i>=1; i--) { if(n%i==0) { //cout << i << endl; ll w; w=n/i; //cout << i << w << endl; if( ((i+w)&1)==0 ) { x=(i+w)/2; y=(w-i)/2; q = 0; cout << x << " " << y <<endl; break; } } else{ continue; } } if(q==1){ cout<<"impossible"<<endl; } }
I题,当时看见这题的时候没想到用暴力解决,用b数组存平方的和,c数组存前几项的和,在求最大乘积即可;代码:
#include<bits/stdc++.h> using namespace std; #define LL long long LL a[1000005],b[1000005],c[1000005]; int main() { LL max=0,ans=0; b[0]=0; c[0]=0; int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]*a[i]+b[i-1]; c[i]=c[i-1]+a[i]; max+=a[i]; } for(int i=1;i<=n;i++) { if(b[i]*(max-c[i])>ans)ans=b[i]*(max-c[i]); } cout<<ans; }
看了别人的思路后自己写了一遍
就是暴力解决,但是定义了一个和,是后面所有项的和,然后在乘上前面的平方和,取最大的数。代码:
#include<bits/stdc++.h> using namespace std; #define LL long long LL n,sum=0,num=0,ans; int a[1000006]; int main() { cin>>n; for(int i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; } for(int i=0;i<n;i++) { sum=sum-a[i]; num+=a[i]*a[i]; if(num*sum>ans)ans=num*sum; } cout<<ans; }
G题就是遇到e时在多输出一个e就可