A 珂朵莉与宇宙
题目链接:
https://www.nowcoder.com/acm/contest/36/A
思路:
科学暴力:枚举前缀和,同时计算前缀和里面可能出现的完全平方数,匹配前缀和 与完全平方数的差值是否在之前的前缀和出现,出现了几次就是存在多少个区间,利用的是连续的性质。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 100005;
int n;
ll b[1005],sum[maxn],vis[maxn*10],cnt;
int main() {
for(int i=0;i<=1000;++i) b[i]=i*i;
while(~scanf("%d",&n)) {
sum[0]=0;
for(int i=1;i<=n;++i) {
scanf("%lld",&sum[i]);
sum[i]+=sum[i-1];
}
for(int i=0;i<=sum[n];++i) vis[i]=0;
vis[0]=1;
cnt=0;
for(int i=1;i<=n;++i) {
for(int j=0;j<=1000;++j) {
if(b[j]<=sum[i]) {
cnt+=vis[sum[i]-b[j]];
}
}
vis[sum[i]]++;
}
printf("%lld\n",cnt);
}
return 0;
}
B 可编程拖拉机比赛
题目链接:
https://www.nowcoder.com/acm/contest/36/B
思路:
控制精度,不乱用ceil与floor函数
代码:
#include <bits/stdc++.h>
using namespace std;
int a[2][4];
int main() {
double n;
while(~scanf("%lf",&n)) {
double b=0.1;
a[0][0]=a[1][0]=0;
for(int i=1;i<=3;++i) {
a[0][i]=a[1][i]=int(n*b);
if(n*b-a[0][i]>1e-8) a[0][i]++;
a[0][i]+=a[0][i-1];
a[1][i]+=a[1][i-1];
b+=0.1;
}
for(int i=1;i<=3;++i) {
if(i==1) printf("%d",a[0][i]-a[1][i]);
else printf(" %d",a[0][i]-a[1][i]);
}
printf("\n");
}
return 0;
}