牛客OI赛制测试赛

A
链接:https://www.nowcoder.com/acm/contest/181/A
来源:牛客网

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

输入描述:
一个整数n
输出描述:
一个整数,表示答案
示例1
输入
复制
4
输出
复制
1
备注:
对于的数据,
对于的数据,
对于的数据,
对于的数据,

对于这道题,打表就会发现奇数是-1,偶数是1。
其实我们可以证明一下:
我们假设 D(n)=F(n1)F(n+1)F(n)F(n)=a D ( n ) = F ( n − 1 ) ∗ F ( n + 1 ) − F ( n ) ∗ F ( n ) = a
那么 D(n1)=F(n2)F(n)F(n1)F(n1)=(F(n)F(n1))F(n)F(n1)F(n1) D ( n − 1 ) = F ( n − 2 ) ∗ F ( n ) − F ( n − 1 ) ∗ F ( n − 1 ) = ( F ( n ) − F ( n − 1 ) ) ∗ F ( n ) − F ( n − 1 ) ∗ F ( n − 1 )
=F(n)F(n)F(n1)(F(n)+F(n1))=F(n)F(n)F(n1)F(n+1)=a = F ( n ) ∗ F ( n ) − F ( n − 1 ) ∗ ( F ( n ) + F ( n − 1 ) ) = F ( n ) ∗ F ( n ) − F ( n − 1 ) ∗ F ( n + 1 ) = − a
因此 D(n)=D(n1) D ( n ) = − D ( n − 1 ) ,带入 D(2)=1 D ( 2 ) = 1 即可得出结果。
B
链接:https://www.nowcoder.com/acm/contest/181/B
来源:牛客网

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

    #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

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[110000],dp[110000];
int main(){
    int n,q;
    ll sum = 0,m;
    scanf("%d %d",&n,&q);
    for(int i=0;i<n;++i){
        scanf("%lld",&a[i]);
        sum += a[i];
        if(i)   dp[i] = a[i]+dp[i-1];
        else dp[i] = a[i];
    }
    while(q--){
        scanf("%lld",&m);
        if(sum%m)   printf("No\n");
        else{
            ll tem = sum/m;
            bool flag = 1;
            for(ll i=1;i<=m;++i){
                if(!binary_search(dp,dp+n,i*tem)){
                    flag = 0;
                    break;
                }
            }
            if(flag)    printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

D
链接:https://www.nowcoder.com/acm/contest/181/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
思路:树的直径,然而有两个点一直段错误,还没找到bug

#include<bits/stdc++.h>
using namespace std;
const int maxn = 300500;
typedef long long ll;
ll dis[maxn];
vector<ll> e[maxn];
vector<ll> w[maxn];
bool vis[maxn];
ll bfs(ll st){
    queue<ll> q;
    memset(vis,0,sizeof(vis));
    memset(dis,-1,sizeof(dis));
    ll maxx=0;
    ll ans;
    vis[st]=1;
    dis[st]=0;
    q.push(st);
    while(!q.empty()){
        ll x=q.front();
        q.pop();
        for(ll i=0;i<e[x].size();i++){
            if(!vis[e[x][i]]){
                q.push(e[x][i]);
                vis[e[x][i]]=1;
                dis[e[x][i]]=dis[x]+w[x][i];
                if(dis[e[x][i]]>maxx){
                    maxx=dis[e[x][i]];
                    ans=e[x][i];
                }
            }
        }
    }
    return ans;
}
inline ll read(){
    ll ans=0;
    char ch=' ';
    while(ch<'0'||ch>'9'){
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        ans=(ans*10+ch-'0');
        ch=getchar();
    }
    return ans;
}
int main(){
    ll n;
    n=read();
    ll a,b,c;
    for(ll i=1;i<=n-1;i++){
        a=read();
        b=read();
        c=read();
        e[a].push_back(b);
        e[b].push_back(a);
        w[a].push_back(c);
        w[b].push_back(c);
    }
    ll tt=bfs(bfs(1));
    ll l=dis[tt];
    ll ans=(l+1)*l/2+10*l;
    printf("%lld\n",ans);
    return 0;
}

E
链接:https://www.nowcoder.com/acm/contest/181/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<bits/stdc++.h>
using namespace std;

int a[25000],dp[25000];
int main(){
    int n;
    scanf("%d",&n);
    memset(dp,0x3f,sizeof(dp));
    for(int i=0;i<n;++i) scanf("%d",&a[i]);
    for(int i=0;i<n;++i){
        *upper_bound(dp,dp+n,a[i]) = a[i];
    }
    printf("%d\n",lower_bound(dp,dp+n,0x3f3f3f3f) - dp);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值