牛客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

备注:

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

对于
的数据,

对于
的数据,
 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本题.
  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

备注:

喵喵喵
 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,分别表示可行/不可行
示例1

输入

复制
5 3
2 1 3 -1 4
3
2
1

输出

复制
Yes
No
Yes

备注:

对于的数据,
对于的数据,
对于的数据,
设ai表示数列中的第i个数,保证
保证数据完全随机
 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千米。

输出描述:

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

输入

复制
5
1 2 2
1 3 1
2 4 5
2 5 4

输出

复制
135

备注:

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

输入

复制
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%

 

 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

输入

复制
3
4 3 
5 3 1 4
5 4
3 7 5 2 1
10 3 
100 1020 2050 102 12 235 4 57 32135 54354 

输出

复制
144
81000
521918013

说明

第一组数据解释
所有长度为3的子序列为
最终答案为

备注:

对于
的数据:

对于
的数据:

对于
的数据:

保证序列中的元素互不相同且
 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 }

 

posted @ 2018-08-31 13:38  starry_sky  阅读(525)  评论(0编辑  收藏  举报