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(n−1)∗F(n+1)−F(n)∗F(n)=a
D
(
n
)
=
F
(
n
−
1
)
∗
F
(
n
+
1
)
−
F
(
n
)
∗
F
(
n
)
=
a
。
那么
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)
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(n−1)∗(F(n)+F(n−1))=F(n)∗F(n)−F(n−1)∗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(n−1)
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;
}