第一次周练题解及个人收获
第一次周练题目发布后,
时隔29天才来做这些题目,我猜我应当是怀着羞愧做完的这些题。然后这几个题我又拖拖拉拉了两天。。。
好吧,废话不多说,直击主题。
A题–我不高兴
#include<bits/stdc++.h>
using namespace std;
const int N=5;
int a[N];
int main(){
for(int i=0;i<3;i++)cin>>a[i];
sort(a,a+3);
if(a[1]+a[0]>a[2])cout<<0;
else cout<<a[2]-a[0]-a[1]+1;
return 0;
}
B题–我很好奇
#include<bits/stdc++.h>
using namespace std;
const int N=1e9;
int main(){
int n,m;
cin>>n>>m;
double mi=N;
for(int i=0;i<n;i++){
double a,b;
cin>>a>>b;
if(a/b*m<mi)mi=a/b*m;
}
printf("%.8lf",mi);
return 0;
}
上面这两个题应该没什么好说的吧!看代码长度就明白了。
C题–我想知道
#include<bits/stdc++.h>
using namespace std;
int n;
bool is_luck(){
int a[]={4,7,44,47,74,77,444,447,474,744,477,747,774,777};
for(int i=0;i<14;i++){
if(n%a[i]==0)return 1;
}
return 0;
}
int main(){
cin>>n;
if(is_luck())cout<<"YES";
else cout<<"NO";
return 0;
}
这个题目注意看清题意(英语不好的我还wrong answer了一次)看来英语不好不配赢。
D题–尽梨了
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b>>c;
cout<<max(max(a*b*c,a+b+c),max(a*(b+c),(a+b)*c));
return 0;
}
这个题中所涉及的运算符排列组合其实一共有六种情况,如果你全部拿出来进行比较,那肯定是可以过的。但是其实有两种是无效的,可以舍去,但是有一种全相加的情况在本题中是一定不能舍去的,当三个数都为1时,三者相加反而最大,其他的就没什么细节可说的了。
E题–银不了
#include<iostream>
#include<cmath>
using namespace std;
void factorial(int v){
double sum=0.0;
for(int i=v;i>1;i--)sum+=log10(i);
cout<<int(sum+1)<<endl;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int v;
cin>>v;
factorial(v);
}
return 0;
}
这个题实话说我是找的题解,我自己采用的是暴力,求位数我反倒把把整个阶乘都求出来了。当输入过大,时间复杂度没让我pass
以下是那个蠢办法的代码:
#include<iostream>
#include<string.h>
using namespace std;
const int N=1e8;
int a[N];
int arrange(int k){
for(int j=0;j<k;j++){
a[j+1]+=a[j]/10;
a[j]%=10;
}
while(a[k]>0){
a[k+1]=a[k]/10;
a[k++]%=10;
}
return k;
}
int factorial(int v){
memset(a,0,sizeof(a));
a[0]=1;
int k=1;
for(int i=v;i>1;i--){
for(int j=0;j<k;j++)a[j]*=i;
k=arrange(k);
}
return k;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int v;
cin>>v;
cout<<factorial(v)<<endl;
}
return 0;
}
题解用的那个数学方案让我直呼妙极!!!
F题–莓办法
#include<bits/stdc++.h>
using namespace std;
int tank,cnt,k,b,ans,a;
bool is_refuel(int v){
tank-=v;
if(tank<0) return 0;
if(cnt!=k-1&&tank-2*(a-v)<0||cnt==k-1&&tank-(a-v)<0){
ans++;
tank=b;
}
tank-=a-v;
return 1;
}
int main(){
int f;
cin>>a>>b>>f>>k;
tank=b;
while(cnt<k){
if(f>b||a-f>b)break;
int v;
if(cnt%2==0)v=f;
else v=a-f;
if(!is_refuel(v))break;
cnt++;
}
if(cnt<k)ans=-1;
cout<<ans;
return 0;
}
这个题目说实话细节挺多的。。。
我主要概括为以下两大点:
1.要注意是否为最后一趟journey,因为这时判断条件有所不同
2.要注意几种ans=-1的情况
G题–All hell Lelouch
#include<bits/stdc++.h>
using namespace std;
int n;
void bomb(int i){
while(i<=n){
cout<<i<<" ";
i+=2;
}
}
int main(){
cin>>n;
cout<<3*n/2<<endl;
bomb(2);
bomb(1);
bomb(2);
return 0;
}
这个题我第一次的code demo是真的瞎装逼,那天我没睡午觉,晚上看这道英文题头晃得厉害(借口理由应该足够充分了吧!哈哈哈哈)
下面是那个递归demo:
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> vec;
void bomb(int s){
int e;
if(n==s)return;
if(n>s+1) {
e=s+2;
vec.push_back(s+1);
vec.push_back(s);
vec.push_back(e);
vec.push_back(s+1);
}
else{
e=s+1;
vec.push_back(e);
vec.push_back(s);
}
bomb(e);
}
int main(){
cin>>n;
if(n==2)printf("3\n2 1 2");
else bomb(1);
int len=vec.size();
cout<<len<<endl;
for(int i=0;i<len;i++)
cout<<vec[i]<<" ";
return 0;
}
其实我觉得写得挺漂亮的,就是不好用,测试的时候不像以往结果出来的很快啊,这次它是在它的答案库里找了很久才找到我这个答案不好用(马老师狗头保命)。
看了题解才发现我是真傻
就是先炸偶数,再炸奇数,再炸偶数,然后ok。。。。。。
至于你问为什么,我只能说这样实现了最大程度对tank的移动控制,就是让你炸的效率最高化了。
还有你可能问不能先炸奇数再炸偶数吗?其实二者理论都是一致的,所以在奇数和偶数数量相同的情况下完全是可以的,但是问题就在于二者数量可能不相同,而且在不相同的情况下必定是奇数多于偶数。
H题–听说樱花下落的速度是每秒五厘米
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
int ans=1;
int i;
for(i=2;i*i<n;i++)
if(n%i==0)ans+=2;
if(i*i==n)ans++;
cout<<ans;
return 0;
}
这题不讲了。
注意平方根那个坑。
现在不知道为什么看到代码重用心就痒痒,然后想尽一切办法构造成函数。。。难道我写代码都有强迫症了吗???
觉得代码写的好看的记得点个赞哦!