您的位置:首页 > 其它

weak win 第一期

2016-07-28 11:10 411 查看
目前还只做了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 敢写敢过,就不说啦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: