牛客OI赛制测试赛1

A - 斐波那契

题目描述

设f[i]表示斐波那契数论的第i项
f[1]=1,f[2] =1,f[i] = f[i - 1] + f[i - 2]
给定一个n

 

输入描述:

一个整数n

输出描述:

一个整数,表示答案

 

示例1

输入

复制

4

输出

复制

1

备注:

对于的数据,
对于的数据,
对于的数据,
对于的数据,

 思路:输出一下找下规律

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>

using namespace std;
int main(){
    string s;
    while(cin>>s){
        int len=s.length();
        int m=s[len-1]-'0';
        if(m%2==0)printf("1\n");
        else printf("-1\n");
    }
}

B - 送分题

题目描述

对于一套题来说,没有一道送分题,就很不符合常理,但是我又懒得写送分题,所以你可以直接复制以下代码,即可ac本题.

  1. #include<cstdio>#include<iostream>  using namespace std; int a,b,c;  int main(){long long l=1,r=int(1e9)<<1:cin》a>>b;while(r-l>1){c=(l+r)>>1;if(c-b<a)l=c;else if(c-b>a)r=c;else return printf("%d\n",c); }     if(l!=r)return printf("%d\n",r);      }

输入描述:

输入共一行,两个整数a和b,范围在int之间

输出描述:

输出一个整数表示答案

 

示例1

输入

复制

5 123

输出

复制

128

备注:

喵喵喵

思路:emmm我果然还是太年轻真的复制粘贴了……

看讨论区说这是a+b的另一种求法,而且题中说输入两个整数a,b,没说是正的啊,所以按找题中l,r都是正的肯定不行,可以令l=-r,也可以直接输出a+b。

注意啦,我以前都不知道,返回值要是0啊,printf的返回值不是0,所以不能return printf…

printf("%d\n",printf("hello A\n"));//后面的返回8
printf("%d\n",printf("aaa"));//后面的返回3

代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
long long a,b,c;
int main(){
    long long r=int(1e9)<<1,l=-r;
    cin>>a>>b;
    while(r-l>1){
        c=(l+r)>>1;//c表示一直在试a+b的值
        if(c-b<a)l=c;//c估计的小了些
        else if(c-b>a)r=c;//c估计的大了些
        else {printf("%lld\n",c);return 0;}
    }  
    if(l!=r){printf("%lld\n",r);return 0;}
}
#include<cstdio>
#include<iostream>
using namespace std;
int a,b,c;
int main(){
    cin>>a>>b;
    cout<<a+b<<endl;
}

C - 序列

题目描述

小a有n个数,他想把他们划分为连续的权值相等的k段,但他不知道这是否可行。

每个数都必须被划分

这个问题对他来说太难了,于是他把这个问题丢给了你。

输入描述:

第一行为两个整数n,q,分别表示序列长度和询问个数。
第二行有n个数,表示序列中的每个数。
接下来的q行,每行包含一个数k,含义如题所示。

输出描述:

输出q行,每行对应一个数Yes或者No,分别表示可行/不可行

 

示例1

输入

复制

5 3
2 1 3 -1 4
3
2
1

输出

复制

Yes
No
Yes

备注:

对于的数据,

对于的数据,

对于的数据,

设ai表示数列中的第i个数,保证

保证数据完全随机

思路:

那划分成连续的k段,则每一段的值为sum/k,只要让每段加到sum/k即可,若是有加不到sum/k的段,则不行。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
 
using namespace std;
#define ll long long
ll a[100005];
int main(){
    int n,q,m,k;
    scanf("%d%d",&n,&q);
    ll sum=0;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        sum+=a[i];
    }
    while(q--){
        int flag=0;
        scanf("%d",&k);
        if(sum%k||n<k){printf("No\n");continue;}
        ll now=0,t=sum/k;
        for(int i=1;i<=n;i++){
            if(now+a[i]==t){now=0;}
            else now+=a[i];
        }
        if(now)flag=1;
        if(!flag)printf("Yes\n");
        else printf("No\n");
    }
}

D - 小叶的巡查

题目描述

8102年,牛客系列竞赛空前繁荣。为了更好地管理竞赛,小叶决定巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了小叶最常做的事情。小叶有一个钱袋,用于存放往来城市间的路费。

这个国家有一套优秀的交通方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

如果不在某个城市停下来修整,在连续行进过程中,小叶所花的路费与他已走过的距离有关,在走第x-1千米到第x千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。

因为国家力挺牛客系列竞赛,所以国家会给小叶报销全部的路费。

现在组织想知道:小叶从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

输入描述:

输入的第一行包含一个整数n,表示包括首都在内的城市数
城市从1开始依次编号,1号城市为首都。
接下来n-1行,描述高速路(高速路一定是n-1条)
每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。

输出描述:

输出一个整数,表示小叶最多花费的路费是多少。

 

示例1

输入

复制

5
1 2 2
1 3 1
2 4 5
2 5 4

输出

复制

135

备注:

n<23333

 思路:和小白赛6的桃花题目差不多,都是走两边dfs,第一遍求出从任意点出发到达的最远距离,第二遍求出从最远点到达的最远距离。不同的是我爆int了qwq

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
  
#define ll long long
using namespace std;
const int N=23340;
struct proc{int to,cost,next;};
proc edge[2*N];
int n,cnt=0,st,head[N];
ll ans=0;
 
void addEdge(int from,int to,int cost){
    edge[cnt].to=to;
    edge[cnt].cost=cost;
    edge[cnt].next=head[from];
    head[from]=cnt++;
}
  
void dfs(int pre,int x,ll km){
    if(km>ans){
        st=x;ans=km;
    }
    for(int i=head[x];i!=-1;i=edge[i].next){
        int a=edge[i].to,b=edge[i].cost;
        if(a==pre)continue;
        dfs(x,a,km+b);
    }
    return ;
}
  
int main(){
    int s,e,c;
    scanf("%d",&n);
    memset(head,-1,sizeof(head));
    for(int i=1;i<n;i++){
        scanf("%d%d%d",&s,&e,&c);
        addEdge(s,e,c);
        addEdge(e,s,c);
    }
    dfs(0,1,0);
    dfs(0,st,0);
    printf("%lld\n",ans*10+(1+ans)*ans/2);
}

E - 旅行青蛙

题目描述

一只青蛙出去旅游,因为中国有一句古话说的好:“由简入奢易,由奢入俭难”,所以这只青蛙当看的当前景点比前面看过的景点差的时候,青蛙就会说“不开心”为了避免这只青蛙说“不开心”,并且使青蛙看的景点尽量的多,所以他请你帮忙给他安排一条线路,使青蛙可以看到尽量多的景点,并且不走回头路。

输入描述:

第一行为一个整数n,表示景点的数量
接下来n行,每行1个整数,分别表示第i个景点的质量

输出描述:

一个整数,表示青蛙最多可以看到几个景点

 

示例1

输入

复制

10
3
18
7
14
10
12
23
30
16
24

输出

复制

6

备注:

景点质量为1到n+23的整数
10<=n<23 10%

23<=n<233 30%

233<=n<2333 60%

2333<=n<23333 100%

思路:最长上升子序

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
  
#define ll long long
using namespace std;
int n,a[23340]={0};
int ans=0;
int dp[23340];
int main(){
    int res=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++){
        dp[i]=1;
        for(int j=1;j<i;j++){
            if(a[j]<=a[i])dp[i]=max(dp[j]+1,dp[i]);
        }
        res=max(res,dp[i]);
    }
    printf("%d\n",res);
}

F - 子序列

F题单独写一下吧,学到了很多~

题解链接:https://blog.csdn.net/m0_37579232/article/details/82318520

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值