比赛名:Preliminaries for Benelux Algorithm Programming Contest 2019 时间2020.3.14
题意就是判断东天际线和北天际线的值可不可以满足(东天际线就是每一行的最大值,北天际线就是每一列的最大值)
判断条件其实很简单,就是看行上的最大值是否也是列上的最大值,如果是就满足。
例1: 东天际线最大值是4,北天际线最大值也是4,所有条件成立。
例2:东天际线最大值是4,北天际线最大值是2,所有不满足。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int r,c;
int a[1001],b[1001];
cin>>r>>c;
for(int i=0;i<r;i++){
cin>>a[i];
}
for(int i=0;i<c;i++){
cin>>b[i];
}
sort(a,a+r);
sort(b,b+c);
if(a[r-1]==b[c-1]){
cout<<"possible"<<endl;
}
else{
cout<<"impossible"<<endl;
}
return 0;
}
题意很好懂就是找出有没有满足m^2-k^2=n的n,给的范围很大如果循环模拟的话肯定要超时,就要找规律。
规律:1=1^2-0^2 2 没有 3=2^2-1^2 4=2^2-0^2 5=3^2-2^2 6 没有 7=4^2-3^2……就是奇数都有m和k且m和k的和就是n并且相邻,偶数只有满足4的倍数才有4 16 64.
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
int main(){
scanf("%lld",&n);
if(n%2==0&&n%4!=0){
printf("impossible");
return 0;
}
if(n%2==0){
ll a=n/4;
printf("%lld %lld",a+1,a-1);
}
else
printf("%lld %lld",(n+1)/2,(n+1)/2-1);
return 0;
}
这题就是输入一个字符串找出有几个e然后原样输出不过e的数目要翻倍
代码:
#include<iostream> using namespace std; int main(){ string a; int sum=0; cin>>a; for(int i=0;i<a.size();i++){ if(a[i]=='e'){ sum++; } } sum*=2; cout<<"h"; for(int i=0;i<sum;i++){ cout<<"e"; } cout<<"y"<<endl; return 0; }
这题根据题目给的意思进行运算就行,注意数字的范围要开到longlong
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1000000+8];
int main()
{
ll n,i,j,k=0,sum=0,mul=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
ll amax=-1;
ll fin,h,m;
for(i=0;i<n;i++)
{
mul+=a[i]*a[i];
sum-=a[i];
k*=sum;
h=mul-a[i]*a[i];
h*=(sum+a[i]);
fin=max(k,h);
amax=max(fin,amax);
}
cout<<amax;
return 0;
}