AtCoder Beginner Contest 234

AtCoder Beginner Contest 234,第1张

AtCoder Beginner Contest 234 A - Weird Function

题意:给一个方程,求值

#include
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int mod=1000000007;
const double eps=1e-8;
ll f(ll x)
{
	return x*x + 2 * x + 3;
}
ll t;
int main(){
	cin>>t;
	cout< 
B - Longest Segment 

题意:给一些二维平面的点,求两点间的最长距离

#include
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int mod=1000000007;
const double eps=1e-8;
struct node
{
	double x,y;
}no[110];
double dis(double a,double b,double a1,double b1)
{
	return pow((a-a1)*(a-a1) + (b-b1)*(b-b1),0.5);
}
int main(){
	int n;
	cin>>n;
	for(int i = 0 ; i < n ; i ++ )
	{
		cin>>no[i].x>>no[i].y;
	}
	double ans = 0;
	for(int i = 0 ; i < n ; i ++ )
	{
		for(int j = i + 1 ; j < n ; j ++ )
		{
			ans = max(ans,dis(no[i].x,no[i].y,no[j].x,no[j].y));
		}
	}
	printf("%.7lf",ans);
	return 0;
}
C - Happy New Year!

题意:一个只能由0和2组成的数,按照大小排列,例如2,20,22,200,202,220,求第n个数的大小
思路:组成的数根据位数长度,是一个公比为2的等比数列,先确定其位置,类似于二进制,将其先算出位数长度,然后确定位于第几位,转化为二进制,接着输出时,将1输出为2即可

#include
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int mod=1000000007;
const double eps=1e-8;
ll a[30];
int arr[1000000];
ll P(ll x)//注意正常的pow函数范围是double,会爆掉
{
	ll ans = 1;
	for(int i = 1 ; i <= x ; i ++ )
	{
		ans *= 2;
	}
	return ans;
}
int main(){
	ll n;
	cin>>n;
	a[1] = 1;
	for(int i = 2 ; i <= 63 ; i ++ )
		a[i] = P(i) - 1;//算等比数列前n项和
	int idx = 0;
	for(int i = 1 ; i < 63 ; i ++ )
	{
		if(n >= a[i] && n < a[i+1])
		{
			idx = i;//确认位于哪一层
			break;
		}
	}
	ll x = 0;//当前这一层的位置,并将其转化为二进制
	if(n == a[idx])	x = n - a[idx - 1] - 1;//如果刚好位于结尾
	else x = n - a[idx] - 1;//因为没有第0位,所以对应的二进制减一
	int c = 0;
	while(x){
		arr[c] = x % 2;
		c++;
		x = x / 2;
	}
	string s = "";
	for(int i = c - 1 ; i >= 0 ; i -- )
	{
		s += to_string(arr[i]);
	}
	cout<<"2";
	if(n == a[idx])	for(int i = idx - 1; i > s.size() ; i -- )	cout<<"0";
	//处理前面的0
	else 	for(int i = idx; i > s.size() ; i -- )	cout<<"0";
	for(int i = 0 ; i < s.size() ; i ++ )
	{
		if(s[i] == '1')	cout<<"2";
		else cout<<"0";
	}
	return 0;
}
D - Prefix K-th Max

题意:给一个长度为n的无序序列,从第k位开始,算前面的序列中第k大的数。
思路:用一个优先队列即可,前k项直接输出队列top即可,从第k+1项开始,如果当前元素大于堆顶,则入队,并将队顶d出,接着输出堆顶,否则小于则不用理会。

#include
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
int n,k;
int a[N];
int main()
{
    priority_queue,greater > qu;//小在队顶
    scanf("%d%d",&n,&k);
    for(int i = 1 ; i <= k ; i ++ ) scanf("%d",&a[i]),qu.push(a[i]);
    cout< qu.top())
        {
            qu.push(a[i]);
            qu.pop();
        }
        cout<					
										


					

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5702773.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存