课上洛谷刷题第一天

5 篇文章 0 订阅

今天,老师“命令”我们做洛谷题

首先是2626,网址放在这,复制search就行了https://www.luogu.com.cn/problem/P2626

题目是让我们先算斐波那契数列第n项,再分解质因数。

我没多想,直接写代码//这是错误答案,倒在了48上,是WA

#include<bits/stdc++.h>
using namespace std;
int fenjie(long long a){
    long long temp=a;
    long long x=2;
    while(temp!=1){
        while(temp%x==0){
            temp/=x;
            if(temp!=1){
                cout<<x<<'*';
            }else cout<<x;
        }
        x++;
    }
    return 0;
}
int main(){
    long long a[50]={0};//初始化
    long long n;
    cin>>n;
    a[1]=1;
    a[2]=1;
    for(int i=3;i<=n;i++){
        a[i]=(a[i-1]+a[i-2])%(int)pow(2.0,31.0);
    }
    cout<<a[n]%(int)pow(2.0,31.0)<<'=';
    fenjie(a[n]%(int)pow(2.0,31.0));
    return 0;
}


然后,我仔细分析了一下,发现有特殊情况1的分解质因数,而且pow(2.0,31.0)就等于1+(long long)INT_MAX

于是第二批次出来了

#include<bits/stdc++.h>
using namespace std;
int fenjie(long long a){
    if(a==1){
        cout<<1;
        return 0;
    }
    long long temp=a;
    long long x=2;
    while(temp!=1){
        while(temp%x==0){
            temp/=x;
            if(temp!=1){
                cout<<x<<'*';
            }else cout<<x;
        }
        x++;
    }
    return 0;
}
int main(){
    long long a[50]={0};//初始化
    long long n;
    cin>>n;
    a[1]=1;
    a[2]=1;
    for(int i=3;i<=n;i++){
        a[i]=(a[i-1]+a[i-2])%(1+(long long)INT_MAX);
    }
    cout<<a[n]%(1+(long long)INT_MAX)<<'=';
    fenjie(a[n]%(1+(long long)INT_MAX));
    return 0;
}

 

AC了

紧接着,就是第二道“送分题”1029

可以直接跳转去那儿https://www.luogu.com.cn/problem/P1029

这题不难,只要会最大公约数的代码∪知道两个数的最大公约数与最小公倍数的乘积等于两数乘积就基本上能ac了

代码放这,需要可借鉴,顺便给下福利,__gcd可以直接算最大公约数,系统自带但是NOIP不准用

 

#include<bits/stdc++.h>
using namespace std;
int main(){
    int p,q,sum=0;//p为最大公约数,q为最小公倍数 
    cin>>p>>q;
    for(int i=p;i<=q;i++){
        if(i%p==0&&q%i==0){
            int j=p*q/i;
            if(__gcd(i,j)==p) sum++;//ij的最大公约数符合了,最小公倍数也一定符合,不信可以证明一下
        }
    }
    cout<<sum; 
    return 0;
}

 

最后,就是这魔鬼的第三题5016https://www.luogu.com.cn/problem/P5016

大佬们可以去尝试一下,虽然只是普及-

这道题题目较为复杂,如果读题的前五分钟没思路,那么你这道题就看不懂

这道题给了我深深的教训,做题时,一定要边做题边写注释啊!!!

然后呢,这道题大概的思路是这样的:

 先把天降的神兵记到总战力里面去,然后计算龙队和虎队的战力,再根据这个战力值调兵,最后注意数据范围,应该用long long

第一次写,wonderful answerWA了五个点

代码在这

#include<iostream>
using namespace std;
long long c[100001],n,m,s1,p1,s2;//n:兵营数,m:分界,c:兵营的工兵数,s1:天降的神兵数
//p1:神兵的兵营,s2:需派出的工兵数 
long long abs(long long a){
    if(a<0) return 0-a;
    return a;
}
long long dragon,tiger;
long long minn=1000000001,minplace;
int main(){
    cin>>n;
    for(long long i=1;i<=n;i++) cin>>c[i];
    cin>>m>>p1>>s1>>s2;
    c[p1]+=s1;
    for(int i=1;i<m;i++) dragon+=c[i]*abs(i-m);
    for(int i=m+1;i<=n;i++) tiger+=c[i]*abs(i-m);
    for(int i=1;i<=m;i++){
        int newdragon=dragon+s2*abs(i-m);
        if(abs(newdragon-tiger)<minn){
            minn=abs(newdragon-tiger);
            minplace=i;
        }
    }
    for(int i=m+1;i<=n;i++){
        int newtiger=tiger+s2*abs(i-m);
        if(abs(newtiger-dragon)<minn){
            minn=abs(newtiger-dragon);
            minplace=i;
        }
    }
    cout<<minplace;
    return 0;
}

然后,我就用方程法重做了这道题,answer cluptionAC了

代码在这

​
#include <bits/stdc++.h>

inline long long read () {
    register long long x = 0 , ch = getchar();
    while( !isdigit(ch)) ch = getchar();
    while( isdigit(ch) ) x = x * 10 + ch - '0' , ch = getchar();
    return x;
}

inline long long abs (long long x) {
    if(x >= 0) return x;
    return -x;
}

long long m, p1, s1, s2, a[1000005], t1, t2;
int n;

int main () {
    
    double where;
    long long gap;
    
    n = read();
    for(int i = 1; i <= n; i ++ ) {
        a[i] = read();
    }
    m = read();
    p1 = read();
    s1 = read();
    s2 = read();//这些都是快读,不用管
    a[p1] += s1;
    
    for(int i = 1; i <= n; i ++ ) {
    	gap += (m - i) * a[i];
    }
    double dgap = gap;
    long long int ans;
    where = m + dgap / s2;//方程的解
    
    if(where >= n) {//大于等于n的情况
    	ans = n;
    }
    else if(where <= 1)//小于等于1的情况
        ans = 1;
    else {
        int iwhere = where;//判断是不是整数
        if(iwhere == where) ans = iwhere;//如果是整数
        else {
            long long ans1 = abs(gap + (m - iwhere ) * s2);
            long long ans2 = abs(gap + (m - iwhere - 1) * s2);//分别计算把s2个工兵放在向下取整和向上取整两个兵营里之后的势力之差
            ans = ans1 <= ans2 ? iwhere : iwhere + 1;//三目运算符
        }
    }
    
    printf("%lld", ans);//答案输出
    
    return 0;
}

​

好啦,不得不说一句,这代码段我是第一次发现编程真是神通广大啊!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值