T1蜡烛

正确代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    //freopen("candy.in","r",stdin);
    //freopen("candy.out","w",stdout);
    int n,k;
    cin>>n>>k;
    vector<int> x(n);
    for(int i=0;i<n;i++) cin>>x[i];
    int t=INT_MAX;
    for(int i=0;i<=n-k;i++){
        int l=x[i];
        int r=x[i+k-1];
        int time1=abs(l)+abs(r-l);
        int time2=abs(r)+abs(r-l);
        int c=min(time1,time2);
        if(c<t) t=c;
    }
    cout<<t;
    return 0;
}

T2白日梦

解决方案

将读入的字符串翻转,dream、dreamer、erase、eraser变成maerd、remaerd、esare、resare,贪心得进行线性扫描即可。

正确代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    //freopen("daydream.in","r",stdin);
    //freopen("daydream.out","w",stdout);
    string s;
    cin>>s;
    reverse(s.begin(),s.end());
    vector<string> w={"resare", "esare", "maerd", "remaerd"};
    size_t p=0;
    bool m=1;
    while(p<s.size()){
        bool f=0;
        for(auto it:w){
            if(s.substr(p,it.size())==it){
                p+=it.size();
                f=1;
                break;
            }
        }
        if(!f){
            m=0;
            break;
        }
    }
    if(m) cout<<"YES";
    else cout<<"NO";
    return 0;
}

T3重复重复重复...重复重复

解决方案

  1. 理解重复数:所有数字相同的数称为重复数,如111、2222等。对于数字d(1−9),长度为k的重复数可以表示为d×(10k1)/9d×(10^k−1)/9
  2. 枚举数字和长度:
  • 我们需要枚举所有可能的数字d(1-9)和长度k(1到N)
  • 对于每个d和k,检查d×(10k1)/9d×(10^k−1)/9是否能被M整除
  • 记录满足条件的最大数
  1. 优化计算:
  • 预处理10^kmod9M的值,避免重复计算
  • 对于每个k,计算10kmod9M10^kmod9M
  • 检查是否存在d使得d×(10k1)0mod9Md×(10^k−1)≡0mod9M
  1. 寻找最大解:从最大长度N开始向下检查
  • 对于每个长度k,检查是否存在合适的d
  • 一旦找到满足条件的k和d,即可构造最大解。

正确代码

#include <bits/stdc++.h>
using namespace std;
string f(int n,int m){
    vector<long long> p(n+1,1);
    for(int k=1; k<=n; ++k){
        p[k]=(p[k-1]*10)%(9LL*m);
    }
    for(int i=n; i>=1;--i){
        long long r=(p[i]-1)/9;
        for(int j=9;j>=1;--j){
            if((j*r)%m==0){
                return string(i,'0'+j);
            }
        }
    }
    return "-1";
}
int main(){
    //freopen("repeat.in", "r", stdin);
    //freopen("repeat.out", "w", stdout);
    int n, m;
    cin>>n>>m;
    cout<<f(n, m);
    return 0;
}

注:所有freopen已注释