Codeforces Round #621 (Div. 1 + Div. 2)A-C简单记录
Posted wsxmmfby-jy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #621 (Div. 1 + Div. 2)A-C简单记录相关的知识,希望对你有一定的参考价值。
这次补了这个题目,emmmm,感觉有点难受
对于A题,很简单,就是经过d次操作可以移到最左边的数目
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <cstring> 6 #include <map> 7 #include <vector> 8 #include <queue> 9 10 using namespace std; 11 typedef long long ll; 12 int t; 13 const int N =110; 14 int main() 15 { 16 cin >> t; 17 while(t--) 18 { 19 int n,d; 20 int a[110]; 21 cin >> n >> d; 22 for(int i=0;i<n;i++) 23 { 24 cin >> a[i]; 25 } 26 for(int i=1;i<n&&d;i++) 27 { 28 int q = a[i] * i; 29 if(d>=q) 30 { 31 a[0]+=a[i]; 32 d -= q; 33 } 34 else{ 35 a[0]+=d/i; 36 break; 37 } 38 } 39 cout << a[0]<<endl; 40 } 41 return 0; 42 }
对于B题有一点点小拐弯,
输入n个数,和一个终点,每次必须走着n个数中的任意一个距离
输出最小步数
这里以为是二维平面,可以不走整数点,所以我们就挑最大的距离走,对应在x轴上也走得最远,这样步数最少
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <map> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 11 using namespace std; 12 typedef long long ll; 13 14 const int N = 1e5+10; 15 ll a[N]; 16 int main() 17 { 18 int t; 19 cin >> t; 20 while(t--) 21 { 22 ll n,x; 23 scanf("%lld%lld",&n,&x); 24 int flag=0; 25 ll ma =0; 26 for(int i=1;i<=n;i++) 27 { 28 scanf("%lld",&a[i]); 29 if(a[i]==x) 30 { 31 flag=1; 32 } 33 ma = ma>a[i]? ma:a[i]; 34 } 35 if(flag) 36 { 37 cout << 1<<endl; 38 continue; 39 } 40 else{ 41 if(ma>x) 42 { 43 cout <<2 <<endl; 44 } 45 else{ 46 ll q = ceil(x*1.0/ma); 47 cout << q<<endl; 48 } 49 } 50 } 51 52 return 0; 53 }
对于C,一个字符串,求他的具有等差距离的子串相同的有多少个,因为要保证距离等差,所以这里我们只需考虑一个和两个的情况,当有大于2个时,肯定包含两个的子串,
所以最多的情况下只需考虑一个和两个组合的情况,
字符串dp,
输入一个字符串,
输出具有等差的子串,相同的最多数目
考虑一个字符和两个的情况
for i <---- 0 to i == len -1
int p = s[i] -‘a‘;//转换成对应数字
for j<----0 to j == 26
dp[j][p] += q[j];//以p为尾的长度为2的子串 个数
max = max(dp[j][p],max)
q[p]++;
max(max,q[p]);
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string> 5 6 using namespace std; 7 typedef long long ll; 8 9 const int N = 1e5+10; 10 ll q[26]; 11 ll dp[26][26];//dp[i][j]代表以ij串的数量 12 int main() 13 { 14 string s; 15 cin >> s; 16 int len = s.length(); 17 ll ma =1; 18 for(int i=0;i<len;i++) 19 { 20 int p = s[i]-‘a‘; 21 ll ms =0; 22 23 for(int j=0;j<26;j++) 24 { 25 dp[j][p] += q[j]; 26 ms = max(dp[j][p],ms); 27 } 28 q[p]++;//这里注意要先更新完dp在更新q, 29 ma = max(q[p],ms); 30 } 31 cout << ma <<endl; 32 return 0; 33 }
以上是关于Codeforces Round #621 (Div. 1 + Div. 2)A-C简单记录的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #621 (Div. 1 + Div. 2) 题解
Codeforces Round #621 (Div. 1 + Div. 2)D dij(思维)
Codeforces Round #621 (Div. 1 + Div. 2)A-C简单记录
Codeforces Round #621 (Div. 1 + Div. 2) D