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 }
View Code

对于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 }
View Code

对于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 }
View Code

猜你喜欢

转载自www.cnblogs.com/wsxmmfby-jy/p/12389447.html
今日推荐