Educational Codeforces Round 74 解题报告

A、Prime Subtraction

水题,只要两个数相差不为1即可。

B、Kill 'Em All

题意:在坐标轴上有n个怪物,都在坐标轴正方向,一旦这些怪物到达0点或者坐标轴负方向,则怪物会被杀死。现在你可以对任意位置发射炮弹,如果炸到怪物,则怪物死亡,位于炮弹左边的怪物向左移动距离r,右边的怪物向右移动距离r,问多最少多少炮弹把所有怪物杀死。
思路:首先想的是贪心,让炮弹炸死最远的怪物,其他的怪物向原点方向移动距离r,然后判断即可。
思维题,其实有思路之后就很好解决了。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
int a[N],b[N],pd[N];
int main()
{
    
    
    int t;
    int n,r,x;
    cin >> t;
    while(t--)
    {
    
    
        cin >> n >> r;
        for(int i=0;i<n;i++)
            cin >> a[i];
        sort(a,a+n);
        int ans=1,sum=r;
        for(int i=n-2;i>=0;i--)
        {
    
    
            if(a[i]==a[i+1])
                continue;
            if(a[i]>sum)
            {
    
    
                ans++;
                sum+=r;
            }else
                break;
        }
        cout << ans <<endl;
    }
    return 0;
}

C、Standard Free2play

题意:人在高为h处平台上,要下到地面,如果在高为x的平台上按下开关,那么x处平台将会缩回去,x-1处的平台改变状态(缩进去的弹出来,弹出来的缩进去),如果人从x处平台直接掉落到x-3处或者更高,那么小人将会摔死,这时候就需要一块钱来改变一个平台来接住小人。问最少需要多少钱才能安全到达地面。
思路:模拟路径即可,具体思路看代码有注释。
这道题之前好像做过,但是还是花了好长时间来思考这道题目应该怎么模拟实现。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
ll a[N],b[N],pd[N];
int main()
{
    
    
    int t;
    ll h,n;
    cin >> t;
    while(t--)
    {
    
    
        cin >> h >> n;
        for(int i=0; i<n; i++)
            cin >> a[i];
        a[n]=0;
        int ans=0;
        for(int i=1; i<n; i++)
        {
    
    
            //此时站在i-1的位置
            //如果i-1的高度与i的高度相差大于1,那么可以达到a[i]+1的位置
            //如果相差等于一,依旧是在a[i]+1的位置
            //所以说看a[i+1]和a[i]是否相差1,如果相差1的话可以从a[i]+1落到a[i+1]这个台子上
            //如果相差大于1,就会摔死,所以要氪金
            if(a[i+1]+1==a[i])
                i++;
            else
                ans++;
        }
        cout << ans <<endl;
    }
    return 0;
}

D、AB-string

题意:给你一个由AB组成的字符串,找出好串的个数。好串是字符串的每个字母至少属于一个长度大于1的回文的串。
思路:因为s的子串中好串的数量是要大于非好串的数量的,所以我们是不是可以只找出s中所有的非好串的子串,最后用总的子串减去非好串的子串。且可以看出,非好串即单个A带着多个B或单个B带多个A的情况。
想了半天没想出来怎么解,然后现在看题目看错了,关于好串的意思理解错了,然后跑偏了没想出来怎么个解法。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
ll c[N],b[N],pd[N];
vector<ll> a;
int main()
{
    
    
 ll n;
 string s;
 cin >> n >> s;
 for(ll i=0;i<n;i++)
 {
    
    
  char c = s[i];
  ll cnt = 1;
  while(s[i+1]==c)
  {
    
    
   i++;
   cnt++;
  }
  a.push_back(cnt);
 }
 ll ans = n*(n-1)/2; //s的所有子串数
 for(int i=1;i<a.size();i++)
  ans -= (a[i-1]+a[i]-1);
 cout << ans <<endl;
 return 0;
}

E、F题难题和数据结构的题目,还没得整理。

猜你喜欢

转载自blog.csdn.net/qq_45949914/article/details/107477674
今日推荐