链接 :https://www.nowcoder.com/acm/contest/90#question
A 跳台阶
类似斐波那契
#include <bits/stdc++.h>
using namespace std;
string a;
int f[40];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
f[1]=1;
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=0;j<i;j++)
{
f[i]+=f[j];
}
}
cout<<f[n]<<endl;
}
return 0;
}
D psd面试
经典问题,求最长回文子序列
转移方程
i j表示从到j的最长回文串
1 两端相等 等于中间+2
dp[i][j] =dp[i+1][j-1]+2 s[i]==s[j]
2 不想等 等于左右两边大值
dp[i][j]=max(dp[i+1][j],dp[i][j-1]) s[i]!=s[j]
双循环 len –>0 i+1–>len
#include <bits/stdc++.h>
int dp[10000][10000];
using namespace std;
int main()
{
string s;
while(cin>>s)
{
int len=s.length();
for(int i=0;i<len;i++)
{
dp[i][i]=1;
s[i]=s[i]>='a'&&s[i]<='z' ?s[i]:s[i]+32;
}
for(int i=len;i>=0;i--)
{
for(int j=i+1;j<len;j++)
{
if(s[i]==s[j])
dp[i][j]=dp[i+1][j-1]+2;
else
dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
}
}
cout<<len-dp[0][len-1]<<endl;
}
return 0;
}
F 等式
化简 (x-n)(y-n)=n^2
就是求n^2的因子个数
#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
int main()
{
long long a;
long long b;
int t;
cin>>t;
while(t--)
{
cin>>a;
long long k=a*a;
int vi[10000][2];
memset(vi,0,sizeof(vi));
int ans=0;
long long w=sqrt(k);
for(int i=2;i<=k;i++)
{
if(k%i==0)
{
vi[ans][0]=i;
while(k%i==0)
{
k/=i;
vi[ans][1]++;
}
ans++;
}
}
if(k!=1)
{
vi[ans][0]=k;
vi[ans++][1]++;
}
// cout<<vi[0][1]<<endl;
long long anss=1;
for(int i=0;i<ans;i++)
{
anss*=(vi[i][1]+1);
}
cout<<(anss+1)/2<<endl;
}
return 0;
}
J 强迫症的序列
#include <bits/stdc++.h>
using namespace std;
int f[100009];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int minn=0x3f3f3f3f;
for(int i=0;i<n;i++)
{
cin>>f[i];
minn=min(minn,f[i]);
}
int e=0;
for(int i=0;i<n;i++)
{
e+=f[i]-minn;
}
cout<<e<<" "<<minn+e<<endl;
}
return 0;
}
K 密码
规律题
#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
char s[190000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
scanf(" %s",&s);
int q=n+n-2;
int w=0;
int ww=q;
if(q<=0)
{
printf("%s\n",s);
continue;
}
int len=strlen(s);
for(int i=0;i<len;i+=q)
printf("%c",s[i]);
for(int i=1;i<n-1&&i<len;i++)
{
w+=2; q-=2;
printf("%c",s[i]);
for(int j=i+q;j<len&&i+q<len;j+=q)
{
printf("%c",s[j]);
if(j+w<len)
{
j+=w;
printf("%c",s[j]);
}
else break;
}
}
for(int i=n-1;i<len;i+=ww) printf("%c",s[i;
printf("\0");
if(t) printf("\n");
}
return 0;
}
L 用来作弊的药水
#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long poww(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int a,b,x,y;
cin>>a>>x>>b>>y;
if(poww(a,x)==poww(b,y))
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
正解应该是取对数,不知道为啥错了