问第一次周练的艰辛过程

oj 专栏收录该内容
5 篇文章 0 订阅

第一次周练题解及个人收获

第一次周练题目发布后,
时隔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;
}

这题不讲了。
注意平方根那个坑。

现在不知道为什么看到代码重用心就痒痒,然后想尽一切办法构造成函数。。。难道我写代码都有强迫症了吗???

觉得代码写的好看的记得点个赞哦!

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值