- 前言:由于本蒟蒻弱,只能写出签到题,因此这篇题解都是一些简单题(A题,B题和D题),要是在找一些难题的题解的大佬们,见谅了,这是三道简单题的题解,还有这些题解要是有说不清的地方,请见谅,随时欢迎不懂的同学私信我。
A题
如题所说,就是一道签到题,ai的数据也就是1e9,因此不会map的,也可以使用数组。
代码:#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=100000+100; map<ll,int> cnt; ll a[N]; int n,m; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { ll x; scanf("%lld",&x); if(cnt[x]==0) a[++m]=x; cnt[x]++; } ll ans=0; for(int i=1;i<=m;i++) ans=max(ans,(ll)(cnt[a[i]]*a[i])); cout<<ans<<endl; return 0; }
2.B题
找规律题,可以发现10以内糖果数是17,每100都要加上9,要是到这里就完了,那么这题就真的玩完了,因为这题的数据范围可以“炸死”我们的long long,因此这题需要使用数组(字符串型)来保存,那么如果数组的长度是0的时候就是只有个位数,就直接加就好了,数组的长度是1的时候就是10,长度是2的时候就是100,说到这里,你们应该都知道怎么写了。
那么上我丑陋的代码(这份代码是在比赛的时候写出来的,可能有点乱,见谅!)
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1e9+7; const int N=100000+100; char s[N]; inline ll mo(ll x) { if(x==0) return 0; return x%mod; } int main() { scanf("%s",s); int len=strlen(s); ll sum=0,pos=0; for(int i=len-1;i>=0;i--) { ll num=s[i]-'0'; ll w=0,t=0; for(int j=0;j<pos;j++) { w=t; t=mo(t*10)+num; } if(i==len-1) sum=num; else sum=sum+mo(mo((t-w)*17)+mo(w*9)); //printf("w=%lld t=%lld\n%lld \n",w,t,sum); sum=mo(sum); pos++; } cout<<(sum-1)<<endl; return 0; }
3·D题
这题,我看了那些正确的代码,那些大佬才用了不到10ms就ac的代码,太骚了,太厉害 ,我看不懂,因此什么都不会的我,只有暴力给我使用了,我觉得这题的出题人很友好,看看数据范围字符串b的长度只有40,因此使用dfs去搜索字符串b的回文字符串,然后再去寻找字符串a和b一样的回文字符串,到这里应该就是可以去写代码了,但是我们还可以再优化一些,回想回文字符串的性质,前一半与后一半相同,因此我们dfs字符串b的回文字符串的长度一半就好了。
代码:
#include<bits/stdc++.h> using namespace std; const int N=1e5+100; string a,b; char c[N]; int vis[N],lena,lenb; int ans=0,p=0; inline bool check(int pos,int len) { p=1; int k=0; for(int i=lenb-1;i>pos;i--) { if(b[i]==c[k]) k++; if(k==len) { p=0; return true; } } if(k+1==len) return true; return false; } inline void dfs(int index,int len) { if(2*len-1>lenb||index+1>=lenb) return ; if(ans<=2*len&&check(index,len)) { int k=0,i=0; for(i=0;i<lena;i++) { if(c[k]==a[i]) k++; if(k==len) break; } if(k!=len) return ; /*printf("i=%d len=%d \n",i,len); for(int i=0;i<len;i++) printf("%c",c[i]);printf("\n");*/ int tk=0,tp=1; for(int j=lena-1;j>i;j--) { if(c[tk]==a[j]) tk++; if(tk==len) { tp=0; break; } } if(tk+1<len) return ; ans=max(ans,min(2*len-tp,2*len-p)); } for(int i=index+1;i<lenb;i++) { if(vis[b[i]-'a']) { c[len]=b[i]; len++; dfs(i,len); len--; } } } int main() { cin>>a>>b; lena=a.length(),lenb=b.length(); for(int i=0;i<lena;i++) vis[a[i]-'a']++; dfs(-1,0); printf("%d\n",ans); return 0; }