Wannafly挑战赛5 补题

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;
}
posted @ 2017-12-10 00:52  lemonsbiscuit  阅读(310)  评论(0编辑  收藏  举报