- 前言:由于本蒟蒻弱,只能写出签到题,因此这篇题解都是一些简单题(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;
}


京公网安备 11010502036488号