Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)-A. Contest for Robots
打一场比赛做一个比赛和知识小结。
A. Contest for Robots

A. Contest for Robots

题意:很简单就不写了

思路:

  1. 第一个与第二个答题情况一样时都不选择情况为-1。
  2. 考虑第一个做对同时第二个做错的情况记录为x,第二个做对同时第一个做错的情况记录为y。
    结果就是y/x+1;
    为什么是y/x;对于每一个不够除+1,够除找最合适需要多一个也加1。

做题目时想法
关于这道题目细想:

  1. x==y && x!=0 maxx=2
  2. x>y maxx=1
  3. x==0 -1
  4. 否则 一个循环找

反思:
这个题目其实不需要用for枚举的,自己思路不够好
手速慢,细想花时间也有点多了。

代码1

#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
int n,a[N];
int c[N],b[N];
int main()
{
   
    cin>>n;
    int ans=0,cnt=0;
    for(int i=0; i<n; i++)
    {
   
        cin>>a[i];
    }
    for(int j=0; j<n; j++)
    {
   
        cin>>b[j];
    }
    for(int i=0; i<n; i++)
    {
   
        if(b[i]==1&&a[i]!=1)
        {
   
            ans++;
        }
        else if(a[i]==1&&b[i]!=1)
        {
   
            cnt++;
        }
    }
    if((ans==0&&cnt==0)||cnt==0)
        cout<<"-1"<<endl;
    else if(ans==cnt)
        cout<<"2"<<endl;
    else if(cnt>ans)
        cout<<"1"<<endl;
    else
    {
   
        int y=0;
        int u=cnt;
        for(int i=1;i<=1000;i++)
        {
   
            u=cnt*i;
            if(u>ans)
            {
   
                y=i;
                break;
            }
        }
        cout<<y<<endl;
    }
    return 0;
}

代码2

#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
int n,a[105],b[105];
int main()
{
   
    int x=0,y=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&b[i]);
    for(int i=1;i<=n;i++)
    {
   
        if(a[i]&&!b[i])
            x++;
        if(!a[i]&&b[i])
            y++;
    }
    printf("%d",x?y/x+1:-1);
    return 0;
}

B. Journey Planning

Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)-B. Journey Planning

B. Journey Planning

题意:

思路:

代码1

#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
int n;
long long f[1000000]= {
   0};
int b[200002];
int main()
{
   
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
   
        scanf("%d",&b[i]);
        if(b[i]-i+400000>=0)
            f[b[i]-i+400000]+=b[i];
    }
    ll ans=-1;
    for(int i=0; i<1000000; i++)
    {
   
        if(ans<f[i])
            ans=f[i];
// if(i<100)printf("%d\n",f[i]);
    }
    printf("%lld",ans);
    return 0;
}

代码2

#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
int main()
{
   
    map <int, long long> M;
    int n, x;
    long long ans = 0LL;
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> x, M[i - x] += (long long)x, ans = max(ans, M[i - x]);
    cout << ans;
    return 0;
}

C. Remove Adjacent

Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)-C. Remove Adjacent

C. Remove Adjacent

题意:

小写字母构成的字符串s,让你去不断的删除字母,删除的规则是:将当前字母s[i] 前一个或者后一个 与当前的差为1,则删除当前这个。最后要求你删除字母的操作必须是最大。

思路:

按照题意删除,要想最大,那么我们就需要从字符串中字母字典序最大的开始考虑删除。

关于这道题目:

当时的思考是如思路所写,然后想怎么实现的时候,在想这个每次找一下最大,时间复杂度允许,但写起来不是最好,于是,再考虑一些字母的性质,最大的为’z‘ 那么我们倒过来当前的最大的‘z’,然后判断s[i] 是否与之相等。相等判断是否删除当前的s[i]

反思:

一开始想的时候并没有用string考虑 导致自己花了一些时间去想怎么删除后重构字符串。
所以关于string 今天早上打算细学深思。

代码:

#include <bits/stdc++.h>
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define e end
#define rb rbegin0
#define re rend
#define nd cout<<endl
#define all(s) s.begin(),s.end()
#define pi acos(-1.0)
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=2e5+15;
string s;
int n;
int main()
{
   
    cin>>n>>s;
    int ans = 0;
    for(char C = 'z'; C > 'a'; C--)
        for(int i = 0; i <s.size(); i++)
        {
   
            if(s[i] != C)
                continue;
            if((s[i - 1] + 1 == s[i] && i != 0) || s[i + 1] + 1 == s[i] && i != s.size() - 1)
            {
   
                s.erase(s.begin() + i);
                i = -1;
                ans += 1;
            }
        }
    cout<<ans<<endl;
    return 0;
}

String知识的回顾和加深:

一点都不会的可以去看看这篇博客

或者新写的一篇博客
s.size()

返回s 中字符的字符个数

s.erase( p )

删除迭代器p指向的元素,返回一个迭代器,指向被删除元素后面的元素
也就是删除p这个位置的元素,然后后面的元素往前移一位。

String 的遍历

string s;
string::iterator it;//迭代器
for(it=s.begin();it!=s.end();++it)

代码

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main()
{
   
    string s("wow wow");
    string::iterator it;
    for(it=s.begin();it!=s.end();++it)
        cout<<*it<<endl;
    for(int i=0;s[i];i++)
        cout<<s[i]<<endl;
    cout<<s<<endl;
    return 0;
}