注明:水题
数列
题目
给定一个等差数列和等比数列,求一个范围里有多少个符合的数。
分析
等比的计算由于数据太小,所以模拟就好了。
等差用(b-a)%c+1解决,所以在等比的模拟时需要判重。
代码
#include <cstdio>
using namespace std;
long long a,b,c,d,r,ans;
int main(){
freopen("shulie.in","r",stdin);
freopen("shulie.out","w",stdout);
scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&r);
if (a<=r) ans=(r-a)/b+1;
while (c<=r){
if (c<a||((c-a)%b!=0)) ans++;
c*=d;
if (d==1) break;
}
printf("%lld",ans);
return 0;
}
蚂蚁
题目
给定你一些蚂蚁的方向和坐标,求有多少只蚂蚁不会受伤。
分析
由于坐标最多走到边界2000步,so我们可以模拟步数。
代码
#include <cstdio>
#include <cctype>
using namespace std;
char s[52]; int n,ans,x[52],y[52]; bool v[52],now[52];
int in(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)&&c!='-') c=getchar();
if (c=='-') c=getchar(),f=-f;
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
int main(){
freopen("ant.in","r",stdin);
freopen("ant.out","w",stdout);
n=in(); gets(s+1);
for (int i=1;i<=n;i++) x[i]=in()*2,y[i]=in()*2;
for (int t=1;t<=4000;t++){
for (int i=1;i<=n;i++)
switch (s[i]){
case 'W':x[i]--; break;
case 'E':x[i]++; break;
case 'N':y[i]++; break;
case 'S':y[i]--; break;
}
for (int i=2;i<=n;i++)
if (!v[i])
for (int j=1;j<i;j++)
if (!v[j]&&x[i]==x[j]&&y[i]==y[j]) now[j]=1,now[i]=1;
for (int i=1;i<=n;i++) if (now[i]) v[i]=1,now[i]=0;
}
for (int i=1;i<=n;i++) ans+=v[i];
printf("%d",n-ans);
return 0;
}