- 杜昊阳 的博客
七月day13
- @ 2025-7-27 20:22:32
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重复重复重复...重复重复
解决方案
- 理解重复数:所有数字相同的数称为重复数,如111、2222等。对于数字d(1−9),长度为k的重复数可以表示为。
- 枚举数字和长度:
- 我们需要枚举所有可能的数字d(1-9)和长度k(1到N)
- 对于每个d和k,检查是否能被M整除
- 记录满足条件的最大数
- 优化计算:
- 预处理10^kmod9M的值,避免重复计算
- 对于每个k,计算
- 检查是否存在d使得
- 寻找最大解:从最大长度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已注释