题目:


思路:
这道题一开始方向出现了错误,我居然想用dfs,n的范围这么大(n<20的情况下可以考虑,不过确实应该复习一下dfs。
其实是道简单的模拟题,看看每个n前面能走到的点是不是可以走到后面,看了代码应该就一目了然了
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=211111;
int n,k,a[maxn],b[maxn];
bool f[11][maxn];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
f[1][1]=1,f[2][1]=1;
//int temp;
for(int i=2;i<=n;i++)
{
//temp=i;
if(f[1][i-1])
{
if(abs(a[i]-a[i-1])<=k) f[1][i]=1;
if(abs(b[i]-a[i-1])<=k) f[2][i]=1;
}
if(f[2][i-1])
{
if(abs(a[i]-b[i-1])<=k) f[1][i]=1;
if(abs(b[i]-b[i-1])<=k) f[2][i]=1;
}
if(!f[1][i]&&!f[2][i]) break;
}
if(f[1][n]||f[2][n]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
题目:



思路:
多项式除法,,先算常数项和先算最高项理论上都是可以的,但是需要注意这道题目保证了最高项不等于0,所以先算常数项会有一部分点RE
RE代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=211;
int n,m,a[maxn],b[maxn],c[maxn];
int main()
{
cin>>n>>m;
for(int i=0;i<=n;i++) cin>>a[i];
for(int i=0;i<=n+m;i++) cin>>c[i];
for(int i=0;i<=m;i++)
{
b[i]=c[i]/a[0];
for(int j=0;j<=n;j++)
{
c[i+j]-=b[i]*a[j];
}
}
for(int i=0;i<=m;i++) cout<<b[i]<<" ";
cout<<endl;
return 0;
}
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=211;
int n,m,a[maxn],b[maxn],c[maxn];
int main()
{
cin>>n>>m;
for(int i=0;i<=n;i++) cin>>a[i];
for(int i=0;i<=n+m;i++) cin>>c[i];
for(int i=m;i>=0;i--)
{
b[i]=c[i+n]/a[n];
for(int j=0;j<=n;j++)
{
c[i+j]-=b[i]*a[j];
}
}
for(int i=0;i<=m;i++) cout<<b[i]<<" ";
cout<<endl;
return 0;
}
本文解析了两道编程题:一是模拟题,通过状态转移判断可达性;二是多项式除法,采用从高次项到低次项的计算策略。
971

被折叠的 条评论
为什么被折叠?



