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