牛客练习赛17

Posted starry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客练习赛17相关的知识,希望对你有一定的参考价值。

A 长方体

题目描述

给出共享长方体一个顶点的三个面的面积,求它十二条边的边长和。

输入描述:

一行三个整数a, b, c表示面积(1 <= a, b, c <= 10000)。

输出描述:

一行一个整数表示边长和。
示例1

输入

1 1 1

输出

12
示例2

输入

4 6 6

输出

28

节约时间就直接暴力做了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main() {
 5     int a, b,c;
 6     cin >> a >> b >> c;
 7     for(int x = 1; x <= a; x ++) {
 8         int y = a/x;
 9         int z = c/x;
10         if(x*y == a && y*z == b && x*z == c) {
11             return 0*printf("%d\n",4*(x+y+z));
12         }
13     }
14 
15     return 0;
16 }

B 好位置

题目描述

给出两个串s和x
定义s中的某一位i为好的位置,当且仅当存在s的子序列技术分享图片 满足y=x且存在j使得i=kj成立。
问s中是否所有的位置都是好的位置。

输入描述:

一行两个字符串s,x,这两个串均由小写字母构成。
1 <= |s|, |x| <= 200000

输出描述:

Yes表示是。
No表示不是。
示例1

输入

abab
ab

输出

Yes
示例2

输入

abacaba
aba

输出

No
示例3

输入

abc
ba

输出

No

KMP问题,在s中的子串只要出现了x串,那么那些位置都是好位置。只要求下是否存在没在子串里的就行。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 200010;
 4 char str[N], str1[N];
 5 int nex[N];
 6 int vis[N];
 7 void init(){
 8     int j = nex[0] = -1, i = 0;
 9     int len = strlen(str);
10     while(i < len){
11         if(j == -1 || str[i] == str[j]){
12             nex[++i] = ++j;
13         }else j = nex[j];
14     }
15 }
16 void KMP(){
17     int i  = 0, j = 0, sum = 0;
18     int len = strlen(str), len1 = strlen(str1);
19     while(j < len1){
20         if(i == -1 || str[i] == str1[j]){
21             i++;j++;
22         }else i = nex[i];
23         if(i == len) {
24             // printf("j:%d %d %d\n",j,j+1,j-len+1);
25             vis[j+1]--;
26             vis[j-len+1]++;
27         }
28     }
29 }
30 int main() {
31     cin >> str1 >> str;
32     init();
33     int len1 = strlen(str1);
34     KMP();
35     int ans = 0;
36     for(int i = 1; i <= len1; i ++) {
37         ans += vis[i];
38         if(ans == 0) return 0*printf("No\n");
39     }
40     printf("Yes\n");
41     return 0;
42 }

D 经纬度

题目描述

给定地球的两个经纬度坐标,问这两个点的球面距离和直线距离的差。假设地球为球体,半径为6371009米。

输入描述:

第一行一个整数T表示数据组数。
接下来n行,每行四个数lat1, lng1, lat2, lng2分别表示两个点的经纬度。
正数表示北纬和东经。
负数表示南纬和西经。
数据保证合法。

输出描述:

n行表示答案。
答案保留到米。
示例1

输入

1
43.466667 -80.516667 30.058056 31.228889

输出

802333

有个坑,输入的是纬经度,不是经纬度。坑了好久。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main() {
 5     int t;
 6     cin >> t;
 7     int r = 6371009;
 8     double PI = acos(-1);
 9     while(t--) {
10         double lat1, lng1, lat2, lng2;
11         cin >> lat1 >> lng1 >> lat2 >> lng2;
12         lat1+= 180; lat2+=180;
13         lat1 *= PI/180;lat2 *= PI/180;
14         lng1 *= PI/180;lng2 *= PI/180;
15         double x1, x2, y1, y2, z1, z2;
16         z1 = r * sin(lat1);
17         y1 = r * cos(lat1) * sin(lng1);
18         x1 = r * cos(lat1) * cos(lng1);
19         z2 = r * sin(lat2);
20         y2 = r * cos(lat2) * sin(lng2);
21         x2 = r * cos(lat2) * cos(lng2);
22         double len1 = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
23         double len2 = 2 * r * asin(len1 / (2 * r));
24         //printf("%.lf %lf\n",len1,len2);
25         // printf("%.lf %.lf %.lf %.lf %.lf %.lf\n",x1,y1,z1,x2,y2,z2 );
26         printf("%lld\n",(long long)(len2 - len1 + 0.5));
27     }
28     return 0;
29 }

 

以上是关于牛客练习赛17的主要内容,如果未能解决你的问题,请参考以下文章

牛客练习赛17

转载:牛客练习赛17 c 规律题

牛客练习赛17 B-好位置

牛客练习赛17-A-长方体

牛客练习赛13D

牛客练习赛13