A. Architecture
题意:要求你判断按题目所给的要求,能否形成矩阵,能就输出“possible”,否则,输出”impossible“,给v胡的条件是每行,每一列的最大值,问你能形成符合要求的矩阵
题解:我们可以先求出两个序列的最大值,判断它们是否相等,若相等,则可以,反之,不可以,这样做的原理是,行上的最大值一定再某一行上,列上的最大值一定在某一列上,而这两个数一定是同一个数,否则就会产生矛盾。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int r,c;
cin>>r>>c;//行 列
int E[150],N[150];
for(int i=0;i<r;i++){
cin>>E[i];
}
for(int i=0;i<c;i++){
cin>>N[i];
}
/*----解法一
int f=1;
for(int i=0;i<r;i++){
int cnt=0;
for(int j=0;j<c;j++){
if(E[i]>N[j]){
cnt++;
}
}
if(cnt==c){
f=0;
}
}
int g=1;
for(int i=0;i<c;i++){
int cnt=0;
for(int j=0;j<r;j++){
if(N[i]>E[j]){
cnt++;
}
}
if(cnt==r){
g=0;
}
}
if(f==1&&g==1){
cout<<"possible"<<endl;
}else{
cout<<"impossible"<<endl;
}*/
//解法二
sort(E,E+r);
sort(N,N+c);
if(E[r-1]==N[c-1]){
cout<<"possible"<<endkl
}else{
cout<<"impossible"<<endl;
}
sort()
return 0;
} F Floor Plan
题意:这个题的本质是要你判断
是否成立,给你
,成立,则输出是指成立的
,任意一组,均可。
题解:solve one:可以将
化为
,这时,我们只需要找出一组
的因子,找出一数,使它到两个因子的“都相等”即可。
solve two:这里要运用一些小知识:
是奇数时,一定是:奇数-偶数的,所以我们设
为奇数,则
为偶数,计算化简
即可得到一个整式,这个整式的值为
,我们可以反解出
,最后,即可得 到两个符合题意的整数,当
是偶数是用同样的方法进行讨论。
当给出的奇数+奇数 = 偶数,偶数+偶数=偶数,奇数+偶数=奇数奇数+奇数 = 偶数,偶数+偶数=偶数,奇数+偶数=奇数
代码:
解法一:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll m,k;
int main(){
scanf("%lld",&n);
int f=0;
for(ll i=1;i*i<=n;i++){
if(n%i==0){
ll k1=n/i;//两个因子,都是整数
if((k1+i)%2==0){
ll temp=(k1+i)/2;
m=temp;
f=1;
k=abs(temp-i);
break;
}
}
}
if(f==1){
cout<<m<<" "<<k<<endl;
}else{
cout<<"impossible"<<endl;
}
return 0;
} G Greetings!
#include<iostream>
#include<string.h>
using namespace std;
int main(){
string ptr;
cin>>ptr;
int num=0;
for(int i=0;i<ptr.length();i++){
if(ptr[i]=='e'){
num++;
}
}
cout<<'h';
for(int i=0;i<2*num;i++){
cout<<'e';
}
cout<<'y'<<endl;
return 0;
} I Inquiry I
题解:首先想到的是模拟,不过会超时,其实,我们可以在输入数据的时候就将数列中的前
项平方和算出来,用数组存,同理,亦可以算出最后n项和,最后在模拟,就不会超时了。
#include<iostream>
#include<string.h>
using namespace std;
long long num[1000005]={0};
long long a[1000005]={0};
long long b[1000005]={0};
int main(){
long long n;
cin>>n;
for(int i=0;i<n;i++){
cin>>num[i];
if(i==0){
a[i]=num[i]*num[i];
}else{
a[i]=a[i-1]+num[i]*num[i];
}
}
for(int i=n-1;i>=0;i--){
if(i==n-1){
b[i]=num[i];
}else{
b[i]=b[i+1]+num[i];
}
}
long long max_n=-1;
for(int i=0;i<n-1;i++){
max_n=max(max_n,a[i]*b[i+1]);
}
cout<<max_n<<endl;
return 0;
} 


京公网安备 11010502036488号