11.2 Educational Codeforces Round 63 (Rated for Div. 2)

总结:

缺点:

  1. 英语阅读不行。
  2. 题目做得太少,A题一开始看不懂,还以为是求回文串,做完B才知道是字典序问题。
  3. 没有考虑下标问题,输出没处理好。
  4. 知识点薄弱(dp)。

A - Reverse a Substring

思路:问是否可以颠倒两个字符使出现字典序更小的串,遍历保存字典序较大的字符即可,当出现字典序更小的字符交换 然后输出结束程序,如果循环结束还没结束就输出no。
wa问题:没注意下标直接输出cc和i ,需要+1。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
 
const int manx=1e5+5;;
 
int main()
{
    string s;
    int n;
    cin>>n>>s;
    char c=s[0];
    int cc=0;
    for(int i=1;i<n;i++)
    {
        if(c>s[i]){
            put1();
            cout<<cc+1<<" "<<i+1<<endl;
            return 0;
        }
        if(s[i]>c) c=s[i],cc=i;
    }
    put2();
    return 0;
}

B - Game with Telephone Numbers

思路:求能否赢只需要判断后十个数字以外的’8’的数量和其他数字的数量。
当8的数量大于其他的数量时,V赢;否则P赢。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
 
const int manx=1e5+5;;
 
int main()
{
    string s;
    int n;
    cin>>n>>s;
    int a=0,b=0;
    for(int i=0;i<n-10;i++)
        if(s[i]=='8') a++;
        else b++;
    if(a>=b+1) put1();
    else put2();
    return 0;
}

C - Alarm Clocks Everywhere

思路:给一个闹钟,要求在一定时间点能够响起,只需要求每个时间点减去第一次响的时间(即求她们的间隔)的最大公约数ans,这样保证每个时间点都可以响起来,然后遍历p数组如果存在一个数的倍数是ans,那么这个数就是答案。
例如 3 12 18 差值 9 15 最大公约数 3 那么只要一个数的倍数是3 那么这个数就可以转化成3 随后可以把3转换成 差值 9和15 3就可以变成12 18。
wa问题:没考虑倍数关系,第一次直接遍历p 当ans==p[i] 就输出了答案。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
 
const int manx=3e5+5;;
ll a[manx];
 
int main()
{
    ll n,m;
    n=read(),m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    ll y=a[1],flag=0,b;
    ll ans=0;
    for(int i=2;i<=n;i++) ans=__gcd(a[i]-a[1],ans);
    for(int i=1;i<=m;i++){
        b=read();
        if(ans%b==0) flag=i;  //if(ans==b) wa了一发
    }
    if(flag){
        put1();
        cout<<y<<" "<<flag<<endl;
    }
    else put2();
    return 0;
}

D - Beautiful Array

思路:简单dp,分三种情况,一种还没乘m ,一种正在乘m,一种已经乘m。
wa问题:求最小连续段和最大连续段,分情况整个子段*m,不知道为啥wa。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}

const int manx=3e5+5;;
ll a[manx],dp[manx];

int main()
{
    ll n,m,ans=-inf;
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
        dp[0]=max((ll)0,dp[0]+a[i]);
        dp[1]=max(dp[0],dp[1]+a[i]*m);
        dp[2]=max(dp[1],dp[2]+a[i]);
        ans=max(ans,dp[2]);
    }
    cout<<ans<<endl;
    return 0;
}

发布了50 篇原创文章 · 获赞 15 · 访问量 4247

猜你喜欢

转载自blog.csdn.net/JiangHxin/article/details/102869365