Good Bye 2018(A-C) D待补(暑假训练8.7)

本文回顾了一天中解决三个技术问题的挑战:寻找满足条件的圣诞装饰组合、高效找到向量加和恒定的解决方案,以及计算多人圆圈跳动的累计编号。作者分享了暴力遍历、观察规律和优化算法的尝试,以及遇到的超时问题和改进策略。
摘要由CSDN通过智能技术生成

机票

战绩and总结在这里插入图片描述

被兴哥吊锤的一天呢x压哨开出C,然后B把自己做破防了,告诉自己一万遍不要上头无脑提交然而并没有啥用:)

A. New Year and the Christmas Ornament

题意:有三种颜色的装饰,已知他们的数量分别是a,b,c。要求是你去装饰圣诞树时满足a=b+1=c+2,求最大的a。
思路:因为数据范围很小,所以从大到小暴力遍历即可

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int y,b,r;
    cin>>y>>b>>r;
    for(int i=r;i>=3;i--)
    {
        if(b>=i-1&&y>=i-2)
        {
            cout<<3*i-3<<endl;
            break;
        }
    }
    return 0;
}

B. New Year and the Treasure Geolocation

题意:读入一个正整数n,接下来读入2n行,一共2n个向量,保证存在一个向量,定于v,使得n∗2个向量两两相加,加出来的n个向量等于v。
在这里插入图片描述
思路①:兴哥的思路是看题目的式子就能知道了,把n个坐标与另外n个坐标以某种排列一一对应 使每一组对应的坐标x,y分别相加得到的新坐标 (Tx,Ty) (Tx,Ty )是一样的对于任意一组对应的坐标 ,所以只要把所有x,y分别加起来并除以n就可以了…在这里插入图片描述
思路②:因为凑成的新坐标都是相同的,并且xi+xj=Tx,y1+y2=Ty,那么假设题目只要求横坐标,那么确保答案一定存在的情况下那不就是最小的加上最大的就行了,考虑纵坐标同理
思路③:此题不难想到O(n^2)的做法,即将所有的(x,y)和(a,b)一一配对,用map统计每种(x+a,y+b)出现的次数,出现n次的即为答案。
我的做法:用O(n^2)去暴力的找出现最多的个数,不断的更新查询,超时了,以后注意如果是纯暴力得开unordered_map。

C. New Year and the Sphere Transmission

题意:就是n个人围成一圈,从第一个人开始,每次可以往后跳k步(1<= k <= n)最后跳回第一个人那里, 对于每个k把它经过的人的编号加起来,假设为fk , 把fk排序后去重然后输出。
在这里插入图片描述
思路:不管是画图还是自己找规律都不难发现每一次选的数的个数都是n的约数,所以枚举约束用等差数列求和公式计算即可(不用会t!)
假设每次跳k步,能够到的点就是1+k,1+2k,1+3k,所以n的约数。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5;
int a[maxn];
long long sum(int a,int n)
{
    long long sum1=0;
    long long nn=(n%a==0?n/a:n/a+1);
    sum1=nn+(nn*(nn-1))/2*a;
    return sum1;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,i,j,cnt=0;
    cin>>n;
    for(i=2;i<=n/i;i++)
    {
        if(n%i==0)
        {
            a[cnt++]=i;
            if(n/i!=i)
                a[cnt++]=n/i;
        }
    }
    sort(a,a+cnt);
    cout<<1<<" ";
    for(i=cnt-1;i>=0;i--)
    {
        cout<<sum(a[i],n)<<" ";
    }
    cout<<sum(1,n)<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值