codeforces div2 724A-C

目录

A-Problem - A - Codeforces

B-Problem - B - Codeforces

C-Problem - C - Codeforces


A-Problem - A - Codeforces

题意:让我们通过给定的一些数字,构造出一个nice数组,能构造出来就输出数组大小和内容,否则就输出No

思路:有两种方案:

第一种,通过观察样例,“8 12 6 2 4 10”,可以发现这是一个等差数列,萌生了一个想法,当a0>0(a0<0,明显不满足题意,直接输出No)时是不是找到公差d就可以满足构造nice数组的条件了呢?智商不够的我认为排好序的数组中a1-a0即为公差,WA一波,其实公差是所给的一串数字的最大公约数

另外还需注意特殊情况0存在于所给数组之中,不需额外添加数字使原数字中最大的数字出现在nice数组中。

第二种,更加简单,n最大为100,如果一串数字中没有出现负数,那就直接输出0到100

#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

typedef long long ll;

using namespace std;
ll gcd(ll a,ll b){return b==0?a: gcd(b,a%b);}
int main(){
    int t;
    ll n,a;
//    freopen(R"(C:\Users\Vicky\Desktop\ABC\in.txt)","r",stdin);
//    freopen(R"(C:\Users\Vicky\Desktop\ABC\out.txt)","w",stdout);
    cin>>t;
    while (t--){
        cin>>n;
        vector<ll>v;
        for(int i=0;i<n;i++){
            cin>>a;
            v.push_back(a);
        }
        sort(v.begin(),v.end());
        if (v[0]<0){
            cout<<"No"<<endl;
        }
        else{
            ll d=v[0];
            for(int i=1;i<v.size();i++)d= gcd(v[i],d);
            ll ans= min(d,v[0]);
            ll end=v[0]==0?v[v.size()-1]:v[v.size()-1]+d;
            cout<<"Yes"<<endl;
            cout<<(end-ans)/d+1<<endl;
            while (ans<=end){
                cout<<ans<<" ";
                ans+=d;
            }
            cout<<endl;
        }
    }
}

B-Problem - B - Codeforces

题意:从一个给定的字符串中,找到第一个字典序最小的连续的不存在于原字符串的字符串

思路:暴力即可。答案的字符串要么是从a-z,要么是从aa-zz,要么是从aaa-zzz,那为啥不是aaaa-zzzz?因为字符串长度为2的时候有676种情况,为3的时候就有26^{3}种情况了,即17576种情况,但题目中说到The sum of nn over all test cases will not exceed 1000. 所以长度为3就够用了。

#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
typedef long long ll;
using namespace std;
void getS(){
    freopen(R"(C:\Users\Vicky\Desktop\ABC\in.txt)","r",stdin);
//    freopen(R"(C:\Users\Vicky\Desktop\ABC\out.txt)","w",stdout);
}
int main(){
//    getS();
    int t;
    ll n;
    string s;
    cin>>t;
    vector<string>v;
    char ch[4]={0};
    for(char c='a';c<='z';c++){
        ch[0]=c;
        v.push_back(ch);
    }
    for(char c='a';c<='z';c++){
        ch[0]=c;
        for(char c1='a';c1<='z';c1++){
            ch[1]=c1;
            v.push_back(ch);
        }
    }
    for(char c='a';c<='z';c++){
        ch[0]=c;
        for(char c1='a';c1<='z';c1++){
            ch[1]=c1;
            for(char c2='a';c2<='z';c2++){
                ch[2]=c2;
                v.push_back(ch);
            }
        }
    }
    while (t--){
        cin>>n>>s;
        for(auto &a:v)if (s.find(a)==string::npos){
            cout<<a<<endl;
                break;
        }
    }
}

C-Problem - C - Codeforces

题意:求给定字符串的前缀字符串中,有多少段字符串的比值(D和K的比值)和前缀字符串的比值是一样的

思路:用map<pair<int,int>,int>记录一下即可

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <fstream>
typedef long long ll;
using namespace std;
map<pair<int,int>,int>cnt;
void getS(){
    freopen(R"(C:\Users\Vicky\Desktop\ABC\in.txt)","r",stdin);
//    freopen(R"(C:\Users\Vicky\Desktop\ABC\out.txt)","w",stdout);
}
int gcd(int a,int b){
    if (a==0)return b;
    return b==0?a: gcd(b,a%b);
}
void solve(){
    cnt.clear();
    int n;
    cin>>n;
    string s;
    cin>>s;
    int l=0,r=0;
    for(int i=0;i<n;i++){
        if (s[i]=='D')l++;
        else r++;
        int t=gcd(l,r);
        cnt[{l/t,r/t}]++;
        cout<<cnt[{l/t,r/t}]<<" ";
    }
    cout<<endl;
}
int main(){
    //getS();
    int t;
    cin>>t;
    while (t--){
        solve();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值