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本题.
- #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