weak win 第一期

目前还只做了ACD
等今天打完多校再补一下E,F? B题 题意真的读不懂

A
给你一个大圆(半径为R),再给你n个小圆(半径为r),问你如果把小圆放进大圆里面(在边缘都有接触的情况下),能否把n个小圆都放进去;

感觉关键条件就是:每个小圆都要贴着大圆放,那么所有的小圆圆心都是落在一个半径为(R-r)的圆上,然后2*pi 就被分为了n份,在 顶角为2 * pi/n 的等腰三角形中(腰为R-r), 我们只需要满足 (R-r)* sin(2pi/n/2) >=r,即可 ,注意 这个精度要达到 10-9, 之前就是eps写成1e-6 所以wa了。

int main(){
    int n,R,r;
    scanf("%d %d %d",&n,&R,&r);
    if(n==1)
        R>=r?printf("YES\n"):printf("NO\n");
    else{
       sin(pi*1.0/n)*(R-r) >= r-eps?printf("YES\n"):printf("NO\n"); 
    }
    return 0;
}

C
给你一串数字,可能有多个数字相同,然后问你最多可以选多少组 3个各不相同的数字出来。 并输出(输出按组内从大到小输出)
比如: 1 2 2 3 4 5
就可以是 1 2 3 和 2 4 5 两组。
一开始想了很多 优先队列乱搞的方法,但是都是在乱搞= =。 最后发现我们只要每次都选出现的最多的那三个就好了, 于是用优先队列搞了一下,这里就顺便可以复习一下优先队列的自定义规则如何写:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define mem(a) memset(a,0,sizeof(a))
#define fr(i,n) for(int i=0;i<n;i++)
const double pi = acos(-1.0);
#define eps 1e-9
const double e = exp(1.0);
template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
template<class T> inline T Min(T a, T b) { return a < b ? a : b; }
template<class T> inline T Max(T a, T b) { return a > b ? a : b; }
bool cmpbig(int a,int b){return a>b;}
bool cmpsmall(int a,int b){return a<b;}
using namespace std;
int r[100005];
int ans[100005][5];
map<int,int> mp;
struct cmp{
    bool operator()(int &a,int &b){
        if(mp[a]==mp[b])
            return a<b;   //队列内 按从大到小排列
        else
            return mp[a]<mp[b];   //按出现次数从大到小排列
    }
};
bool cmp2(int a,int b){
    return a>b;
}

int main(){
    int n;
    scanf("%d",&n);
    priority_queue<int, vector<int>, cmp > q;
    for(int i=1;i<=n;i++){
        scanf("%d",&r[i]);
        mp[r[i]]++;
    }
    map<int ,int> flag;
    for(int i=1;i<=n;i++){
        if(!flag[r[i]]){
            q.push(r[i]);
            flag[r[i]]++;
        }
    }
    int size=0;
    while(q.size()>2){
        int a,b,c;
        a=q.top(),q.pop(),mp[a]--;
        b=q.top(),q.pop(),mp[b]--;
        c=q.top(),q.pop(),mp[c]--;
        ans[size][1]=a;
        ans[size][2]=b;
        ans[size][3]=c;
        size++;
        if(mp[a]) q.push(a);
        if(mp[b]) q.push(b);
        if(mp[c]) q.push(c);
    }
    printf("%d\n",size);
    for(int i=0;i<size;i++){
        sort(ans[i]+1,ans[i]+4,cmp2);
        printf("%d %d %d\n",ans[i][1],ans[i][2],ans[i][3]);
    }
    return 0;
}

D 敢写敢过,就不说啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本
我明白了,你要求将一个弱引用分配给一个变量。在 C++ 中,可以通过使用 `std::weak_ptr` 来实现弱引用。`std::weak_ptr` 是一种智能指针,可以用于跟踪 `std::shared_ptr` 的生命周期。这样,当 `std::shared_ptr` 所管理的对象被销毁时,`std::weak_ptr` 会自动失效。下面是一个简单的示例代码: ```cpp #include <iostream> #include <memory> int main() { std::shared_ptr<int> sharedPtr = std::make_shared<int>(42); std::weak_ptr<int> weakPtr = sharedPtr; // 使用 weakPtr 获取对象的值 if (auto lockedPtr = weakPtr.lock()) { std::cout << "Weak pointer value: " << *lockedPtr << std::endl; } else { std::cout << "Weak pointer expired" << std::endl; } // 销毁 sharedPtr sharedPtr.reset(); // 再次尝试使用 weakPtr 获取对象的值 if (auto lockedPtr = weakPtr.lock()) { std::cout << "Weak pointer value: " << *lockedPtr << std::endl; } else { std::cout << "Weak pointer expired" << std::endl; } return 0; } ``` 在这个示例中,`sharedPtr` 是一个 `std::shared_ptr`,并且我们使用它创建了一个 `std::weak_ptr`,即 `weakPtr`。我们可以通过调用 `lock()` 方法来检查 `weakPtr` 是否有效,如果有效,就可以使用它来获取所管理的对象的值。当 `sharedPtr` 被 `reset()` 销毁后,再次使用 `weakPtr` 时,`lock()` 方法将返回一个空指针,表示弱引用已经失效。 希望这个示例能对你有所帮助!如果你有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值