2017ccpc网络预选赛1005

本文分享了编号1005题目的解题思路与实现代码,通过对不同余数情况的分析,找到了求解最大面积的规律,并讨论了算法优化的经验教训。

#include<cstdio>
#include<cstring>
#define maxl 100000
#define eps 1e-8

int ans;
double n;
double f[maxl];

void prework()
{
    f[1]=0;f[2]=0,f[3]=0;f[4]=2;
    for(int i=5;i<maxl;i++)
    {
        if(i%4==1)
            f[i]=f[i-1]+(double)((double)(i-1)/4.0-0.5);
        if(i%4==2)
            f[i]=f[i-2]+(double)(i-2)/2.0;
        if(i%4==3)
            f[i]=f[i-1]+(double)(i-3)/4.0+0.5;
        if(i%4==0)
            f[i]=(double)i*i/8.0;
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    prework();
    for(int i=1;i<=t;i++)
    {
        scanf("%lf",&n);
        int l=4,r=maxl-1,mid;
        while(l+1<r)
        {
            mid=(l+r)>>1;
            if(f[mid]<n-eps)
                l=mid;
            else
                r=mid;
        }
        if(f[l]>n-eps)
            ans=l;
        else
            ans=l+1;
        printf("%d\n",ans);
    }
    return 0;
}

今天就A了1003,4,5,本来排名还行,结果T了2题,排名翻了番。。推出了那道圆的题目的递推公式,然而T了,我们智商捉急,没想到小于eps break掉。。。然后那个回文串看似能A,但是写的太晚了,没时间优化了、T掉。

1005是我今天最大的收获吧,能做出这种找规律的题还是挺开心的。

反正面积最大,就一定是个凸变形。

%4==0,一定全是对角线的边,%4==1,把其中的一条斜着的向外拓展,就是-掉一条斜边,增加一条垂直边和1条水平边,突出一个包、

%4==2,一定是在i-2的基础上加上2条垂直的边,以获得最大宽度*新垂直的边,%4==3,就是i-1再突出1块,那一块为0.5+1个平行4变形的面积

不想画图。。。。要想彻底搞清就自己画图吧,上面写了大概找法。虽然表述的不好


不同份的CCPC网络赛有不同的题目及解答: - 2018CCPC网络赛:给一张竞赛图,对于所有的4元组,若为四元环贡献是1,有两个点的出度是2则贡献是 -1。先假设所有四元组都是四元环,这部分对答案的贡献是A(n,4)。对于非四元环的四元组,必然存在一个点出度是2,枚举每个度数>=2的点,其对答案的贡献是A(deg[i],2)*(n - 3)*4 ,所以最终答案ans = A(n,4) - ΣA(deg[i],2)*(n - 3)*4 ,这其实要求ΣC(deg[i],2),C(deg,2)=deg*(deg - 1)/2 ,当前度数为n,度数每增加1,对于这个点贡献增加n,可暴力连边跑费用流求解[^2]。 - 2021CCPC网络赛:发现规律,先将剩余的1或2或3构造出来,剩下的四个一组构造。代码实现如下: ```cpp #include<bits/stdc++.h> using namespace std; int main(void) { int t; cin>>t; while(t--) { int n; cin>>n; string ans; if(n%4==1) n=n-1,ans+="1"; else if(n%4==2) n=n-2,ans+="0001"; else if(n%4==3) n=n-3,ans+="01"; for(int i=1;i<=n/4;i++) ans+="1001"; cout<<ans.size()<<endl; cout<<ans<<endl; } return 0; } ``` 该题1009为Command Sequence,难度一般,知识点涉及前缀和与哈希[^4]。 - 2016CCPC网络赛:一个星球一有73天,另一个一有137天,给定第n天,判断这一天是否同时是两个星球一中的第一天,即判断n是否同时整除73和137,因n超大,使用紫书的大数模去一个较小的数的方法,代码如下: ```cpp #include <cstdio> #include <string> #include <cstring> #include <iostream> using namespace std; char n[10000010]; int m; int main(){ int m = 10001; int cas = 1; while(~scanf("%s",n)){ int len = strlen(n); int ans = 0; for(int i=0;i < len;i++){ ans = (int)(((long long)ans*10+n[i]-'0')%m); } printf("Case #%d: ",cas++); if (ans == 0) printf("YES\n"); else printf("NO\n"); } return 0; } ``` [^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值