开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情
又是见证彩笔的一次周赛,学弟AK了,我这个贵物没AK,我要不考虑退役吧!
## AcWing 4806. 首字母大写 第一题应该是不能再送分的送分题了。。。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){
return y?gcd(y,x%y):x;
}
ll qmi(ll x,ll y,int mod){
ll res=1;
while(y){
if(y&1) res=res*x%mod;
y>>=1;
x=x*x%mod;
}
return res;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
string s;
cin>>s;
if(s[0]>='a' && s[0]<='z'){
s[0]=s[0]-'a'+'A';
}
cout<<s[0];
for(int i=1;i<s.size();i++) cout<<s[i];
return 0;
}
这题乍一看我以为是dfs,于是我就跳过了去看最后一题,最后一题wa了之后回来一看肯定不是dfs,因为没有数字个数的限制,而且数据范围也很大,后来发现就是一道简单的模拟+贪心,先考虑不可能的情况(就是输出-1 -1)的情况,也就是9m>s 或者m>1 && s==0这两种情况, 然后考虑最大情况,最大很简单,就是从前到后如果能输出9就输出9,不能的话就输出剩下的s和0,但是最小情况就要考虑到前导不为0的情况,因此可以分s是否为9的倍数的关系以及s和m的关系讨论。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){
return y?gcd(y,x%y):x;
}
ll qmi(ll x,ll y,int mod){
ll res=1;
while(y){
if(y&1) res=res*x%mod;
y>>=1;
x=x*x%mod;
}
return res;
}
int m,s;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>m>>s;
if(s==0){
if(m==1) cout<<"0 0"<<"\n";
else cout<<"-1 -1\n";
}
else if(9*m<s) cout<<"-1 -1\n";
else{
if(s==m*9){
for(int i=1;i<=m;i++) cout<<9;
}
else{
if(s%9==0){
int cnt=s/9;
cout<<1;
for(int i=2;i<=m-cnt;i++) cout<<0;
cout<<8;
for(int i=1;i<=cnt-1;i++) cout<<9;
}
else{
int cnt2=s/9;
int mo=s%9;
if(cnt2+1==m){
cout<<mo;
for(int i=1;i<=cnt2;i++) cout<<9;
}
else{
cout<<1;
for(int i=1;i<m-cnt2-1;i++) cout<<0;
cout<<mo-1;
for(int i=1;i<=cnt2;i++) cout<<9;
}
}
}
cout<<" ";
int cnt1=s/9;
int mo=s%9;
if(cnt1!=m){
}
for(int i=1;i<=cnt1;i++){
cout<<9;
}
if(cnt1!=m) cout<<mo;
for(int i=cnt1+2;i<=m;i++){
cout<<0;
}
}
return 0;
}
C我是最先看的,然后一直卡到最后,nmd,C是一个不难的字符串题,首先暴力+贪心妥妥过,就是找最长的相同前缀和后缀,找出来后输出k次,然后把字符串s的剩余的部分输出,很简单吧,但对于字符串贵物我来说简直逆天模拟,因为少考虑到了循环子串的情况,榆树差一个点,tnn;
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){
return y?gcd(y,x%y):x;
}
ll qmi(ll x,ll y,int mod){
ll res=1;
while(y){
if(y&1) res=res*x%mod;
y>>=1;
x=x*x%mod;
}
return res;
}
int n,k;
string t;
bool ok=0;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>k;
string s;
cin>>s;
for(int i=1;i<=s.size();i++){
string str=s.substr(0,i);
if(s.size()>=str.size()*2){
if(s.size()%str.size()!=0){
string ss="";
int cnt=s.size()/str.size();
for(int i=1;i<=cnt;i++){
ss=ss+str;
}
int mo=n%str.size();
ss=ss+str.substr(0,mo);
if(ss==s){
ok=true;
t=str;
break;
}
}
else{
string ss="";
for(int j=1;j<=s.size()/str.size();j++){
ss=ss+str;
}
if(ss==s){
t=str;
ok=1;
break;
}
}
}
else{
int cnt=0;
for(int j=str.size();j<s.size();j++){
if(s[j]==s[j-str.size()]) cnt++;
}
if(cnt==s.size()-str.size()){
t=str;
ok=1;
break;
}
}
}
for(int i=1;i<=k;i++) cout<<t;
if(t!=s){
for(int i=t.size();i<s.size();i++){
cout<<s[i];
}
}
return 0;
}
退役了。