牛客OI赛制测试赛1
A 斐波那契
题目描述
设f[i]表示斐波那契数论的第i项
f[1]=1,f[2] =1,f[i] = f[i - 1] + f[i - 2]
给定一个n
求![](https://uploadfiles.nowcoder.com/files/20180827/306625_1535375280832_equation?tex=f%5Bn-1%5D*f%5Bn%2B1%5D-f%5Bn%5D%5E2)
f[1]=1,f[2] =1,f[i] = f[i - 1] + f[i - 2]
给定一个n
求
输入描述:
一个整数n
输出描述:
一个整数,表示答案
备注:
对于
的数据,
对于
的数据,
![](https://uploadfiles.nowcoder.com/files/20180829/306625_1535540997777_equation?tex=2%20%5Cleqslant%20n%20%5Cleqslant%2010%5E%7B1000000%7D)
对于
的数据,
对于
的数据,
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 const int N = 1e6+10; 6 char s[N]; 7 int main() { 8 cin >> s; 9 int len = strlen(s); 10 if((s[len-1]-'0')%2==0)printf("1\n"); 11 else printf("-1\n"); 12 return 0; 13 }
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 #include <iostream> 2 #include <stdio.h> 3 #define ll long long 4 using namespace std; 5 6 int main() { 7 ll a, b; 8 cin >> a >> b; 9 cout << a+b<<endl; 10 return 0; 11 }
C序列
题目描述
小a有n个数,他想把他们划分为连续的权值相等的k段,但他不知道这是否可行。
每个数都必须被划分
这个问题对他来说太难了,于是他把这个问题丢给了你。输入描述:
第一行为两个整数n,q,分别表示序列长度和询问个数。
第二行有n个数,表示序列中的每个数。
接下来的q行,每行包含一个数k,含义如题所示。
输出描述:
输出q行,每行对应一个数Yes或者No,分别表示可行/不可行
备注:
对于
的数据,![](https://uploadfiles.nowcoder.com/files/20180829/306625_1535510332779_equation?tex=n%20%5Cleqslant%2010%2Cq%20%5Cleqslant%2020)
对于
的数据,![](https://uploadfiles.nowcoder.com/files/20180829/306625_1535510345806_equation?tex=n%20%5Cleqslant%202000%2Cq%20%5Cleqslant%202000)
对于
的数据,![](https://uploadfiles.nowcoder.com/files/20180829/306625_1535510361523_equation?tex=n%20%5Cleqslant%20100000%2Cq%20%5Cleqslant%201000000)
设ai表示数列中的第i个数,保证![](https://uploadfiles.nowcoder.com/files/20180822/306625_1534908297281_equation?tex=%5Csum%20a_i%20%5Cleqslant%2010%5E%7B13%7D)
保证数据完全随机
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <set> 5 #define ll long long 6 using namespace std; 7 const int N = 1e5+10; 8 ll a[N], s, k; 9 set<ll> st; 10 int main() { 11 int n, q; 12 scanf("%d%d",&n,&q); 13 for(int i = 1; i <= n; i ++) scanf("%lld", &a[i]); 14 for(int i = 1; i <= n; i ++) { 15 s += a[i]; 16 st.insert(s); 17 } 18 while(q--) { 19 scanf("%lld",&k); 20 if(s%k != 0) { 21 printf("No\n"); 22 continue; 23 } 24 ll tmp = s/k; 25 bool flag = true; 26 for(int i = 1; i <= k; ++i) { 27 if(!st.count(tmp*i)) { 28 flag = false; 29 break; 30 } 31 } 32 if(flag) printf("Yes\n"); 33 else printf("No\n"); 34 } 35 return 0; 36 }
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千米。
输出描述:
输出一个整数,表示小叶最多花费的路费是多少。
备注:
n<23333
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define INF 0x3f3f3f3f 4 using namespace std; 5 const int N = 3e4+10; 6 typedef pair<ll,ll> P; 7 vector<P> vs[N]; 8 ll n, v, u, w, MAX, s; 9 bool vis[N]; 10 void dfs(ll u, ll fa, ll w) { 11 if(w > MAX) { 12 MAX = w; 13 s = u; 14 } 15 for(int i = 0; i < vs[u].size(); i ++) { 16 P p = vs[u][i]; 17 if(p.first == fa) continue; 18 dfs(p.first, u, w+p.second); 19 } 20 } 21 int main() { 22 cin >> n; 23 for(int i = 1; i < n; i ++) { 24 cin >> u >> v >> w; 25 vs[u].push_back(P(v,w)); 26 vs[v].push_back(P(u,w)); 27 } 28 dfs(1, -1, 0); 29 dfs(s, -1, 0); 30 cout << MAX*10+MAX*(1+MAX)/2 << endl; 31 return 0; 32 }
E 旅行青蛙
题目描述
一只青蛙出去旅游,因为中国有一句古话说的好:“由简入奢易,由奢入俭难”,所以这只青蛙当看的当前景点比前面看过的景点差的时候,青蛙就会说“不开心”为了避免这只青蛙说“不开心”,并且使青蛙看的景点尽量的多,所以他请你帮忙给他安排一条线路,使青蛙可以看到尽量多的景点,并且不走回头路。
输入描述:
第一行为一个整数n,表示景点的数量
接下来n行,每行1个整数,分别表示第i个景点的质量
输出描述:
一个整数,表示青蛙最多可以看到几个景点
备注:
景点质量为1到n+23的整数
10<=n<23 10%
23<=n<233 30%
233<=n<2333 60%
2333<=n<23333 100%
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 #include <string.h> 5 #define INF 0x3f3f3f3f 6 using namespace std; 7 const int N = 3e4+10; 8 int a[N]; 9 int main() { 10 int n, x; 11 cin >> n; 12 memset(a,INF,sizeof(a)); 13 for(int i = 1; i <= n; i ++) { 14 cin >> x; 15 *upper_bound(a,a+n,x) = x; 16 } 17 printf("%d\n",lower_bound(a,a+n,INF)-a); 18 return 0; 19 }
F 子序列
题目描述
给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果
输入描述:
第一行一个整数T,表示数据组数。
对于每组数据,第一行两个整数N,k,含义如题所示
接下来一行N个整数,表示给出的序列
保证序列内的数互不相同
输出描述:
对于每组数据,输出一个整数表示答案,对
取模
每组数据之间以换行分割
示例1
备注:
对于
的数据:
对于
的数据:
对于
的数据:
保证序列中的元素互不相同且
,
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const ll mod = 1e9+7; 5 const ll md = 1e9+6; 6 const int N = 1010; 7 ll a[N], c[N][N]; 8 ll pow_mod(ll x, ll n){ 9 ll res=1; 10 while(n>0){ 11 if(n&1)res=res*x%mod; 12 x=x*x%mod; 13 n>>=1; 14 } 15 return res; 16 } 17 18 int main() { 19 memset(c, 0, sizeof(c)); 20 c[0][0] = 1; 21 for (int i = 1; i <= 1000; i++) { 22 c[i][0] = 1; 23 for (int j = 1; j <= i; j++) { 24 c[i][j] = (c[i-1][j-1] + c[i-1][j]) % md; 25 } 26 } 27 int t, n, k; 28 scanf("%d", &t); 29 while(t--) { 30 scanf("%d%d", &n, &k); 31 for(int i = 1; i <= n; i ++) cin >> a[i]; 32 sort(a+1,a+1+n); 33 ll res = 1; 34 for(int i = 1; i <= n; i ++) { 35 ll ans = ((c[n-1][k-1] - c[i-1][k-1] - c[n-i][k-1])%md + md) % md; 36 res = res*pow_mod(a[i],ans)%mod; 37 } 38 printf("%lld\n",res); 39 } 40 return 0; 41 }