Comet OJ 热身赛

eustia

题目描述

Novus Aither是一个潜藏着多个势力的城市。每个势力都有一个唯一的领导人,每个领导人有一个属性值。如果两个势力的领导人的属性值分别为a,ba,ba,b,且∣a−b∣≤m|a-b| \le m∣a−b∣≤m,说明这两个领导人的思想有一定的相似之处,这两个势力可以合并,新的领导人可以指定为原来的两个领导人中的任意一个。新产生的势力可以依照相同的规则,继续与其他势力合并。问在所有可能的合并情况中,最少会剩下几个势力。

 

输入描述

第一行两个空格隔开的整数n(1≤n≤106),m(0≤m≤109)n(1 \le n \le 10^6),m(0 \le m \le 10^9)n(1≤n≤106),m(0≤m≤109)。nnn代表当前势力的个数。mmm的含义如题目描述。

第二行nnn个空格隔开的整数di(0≤di≤109)d_i(0 \le d_i \le 10^9)di​(0≤di​≤109),代表第iii个势力的领导人的属性值。

 

输出描述

输出一个数表示势力的最少数量。

 

样例输入 1

4 1 
2 1 3 10

样例输出 1

2
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;

int main(){
	ll n, m;
	cin >> n >> m;
	ll a[n + 1];
	for(int i = 0; i < n; i++){
		cin >> a[i];	
	}
	sort(a, a + n);
	int ans = 0;
	for(int i = 0; i < n; i++){
		if(fabs( a[i] - a[i+1] ) > m){
			ans ++;
		}
	} 
	cout << ans;
	return 0;
}

 

checkin

题目描述

开司正在与另外一人玩石头剪刀布。双方各有一些代表石头、剪刀、布的卡牌,每局两人各出一张卡牌,根据卡牌的内容决定这一局的胜负。胜负规则为:石头赢剪刀、剪刀赢布、布赢石头、相同为平局。每张卡牌至多被使用一次。

已知双方的卡牌数量,问开司最多赢几局?

输入描述

一行六个数字a,b,c,d,e,fa, b, c, d, e, fa,b,c,d,e,f(0≤a,b,c,d,e,f≤500 \leq a, b, c, d, e, f \leq 500≤a,b,c,d,e,f≤50),a,b,ca,b,ca,b,c分别表示开司的石头、剪刀、布的牌的数量,d,e,fd,e,fd,e,f分别表示此时另一人的石头、剪刀、布的牌的数量。

 

输出描述

一个整数表示开司最多赢几局。

 

样例输入 1

29 7 41 14 12 42

样例输出 1

33
#include<iostream>
using namespace std;

int main(){
	int a, b, c;
	int d, e, f;
	int sum = 0;
	cin >> a >> b >> c;
	cin >> d >> e >> f;
	if(a > e)
	{
		sum += e;
	}
	else {
		sum += a;
	}
	if( b > f){
		sum += f;
	}
	else{
		sum += b;
	}
	if(c > d){
		sum += d;
	}
	else{
		sum += c;
	}
	cout << sum << endl;
	return 0;
}

dijkstra

题目描述

 

Eagle Jump公司正在开发一款新的游戏。泷本一二三作为其员工,获得了提前试玩的机会。现在她正在试图通过一个迷宫。

这个迷宫有一些特点。为了方便描述,我们对这个迷宫建立平面直角坐标系。迷宫中有两条平行直线 L1:Ax+By+C1=0L_1:Ax+By+C_1=0L1​:Ax+By+C1​=0, L2:Ax+By+C2=0L_2:Ax+By+C_2=0L2​:Ax+By+C2​=0,还有 nnn 个圆 Ci:(x−xi)2+(y−yi)2=ri2C_i:(x-x_i)^2+(y-y_i)^2={r_i}^2Ci​:(x−xi​)2+(y−yi​)2=ri​2。角色在直线上、圆上、圆内行走不消耗体力。在其他位置上由SSS点走到TTT点消耗的体力为SSS和TTT的欧几里得距离。

泷本一二三想从 L1L_1L1​ 出发,走到 L2L_2L2​ 。请计算最少需要多少体力。

输入描述

 

第一行五个正整数 n,A,B,C1,C2n,A,B,C_1,C_2n,A,B,C1​,C2​ (1≤n≤1000,−10000≤A,B,C1,C2≤10000)(1\le n \le 1000, -10000 \le A,B,C_1,C_2 \le 10000)(1≤n≤1000,−10000≤A,B,C1​,C2​≤10000),其中 A,BA,BA,B 不同时为 0。

接下来 nnn 行每行三个整数 x,y,r(−10000≤x,y≤10000,1≤r≤10000)x,y,r(-10000 \le x,y \le 10000, 1\le r \le 10000)x,y,r(−10000≤x,y≤10000,1≤r≤10000) 表示一个圆心为 (x,y)(x,y)(x,y),半径为 rrr 的圆。

输出描述

 

仅一行一个实数表示答案。与标准答案的绝对误差或者相对误差不超过 10−410^{-4}10−4 即算正确。

样例输入 1

2 0 1 0 -4 
0 1 1 
1 3 1

样例输出 1

0.236068
#include<iostream>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
const double INF = 0x3f3f3f;
double A, B, C1, C2;
int n;

struct node{
	int x;
	int y;
	int z;
};

double len1(double x, double y, double r){
	double len = fabs(A*x + B*y + C1);
	len /= sqrt ( pow(A,2.0)+pow(B,2.0) );
	if (len - r <= 10e-4)
		return 0.0;
	else
		return (len - r);
}
double len2(double x, double y, double r){
	double len = fabs(A*x + B*y + C2);
	len /= sqrt ( pow(A,2.0)+pow(B,2.0) );
	if (len - r <= 10e-4)
		return 0.0;
	else
		return (len - r);
}
double clen(node a, node b){
	double x = a.x - b.x;
	x = x * x;
	double y = a.y - b.y;
	y = y * y;
	double len = sqrt(x+y);
	double r = a.z + b.z;
	if (len - r <= 10e-5)
		return 0.0;
	else
		return (len - r);
}
 



int main(){
	cin >> n ;
	cin >> A >> B >> C1 >> C2;
	double dis[n+5];
	bool vis[n + 5];	

	node cir[n + 5];
	double mp[n + 5][n + 5];
	double len = fabs(C1 - C2) / sqrt( pow(A,2.0)+pow(B,2.0) ); 
	memset (mp, -1, sizeof(mp));
	mp[0][1] = len;
	mp[1][0] = len;
	mp[0][0] = 0;
	mp[1][1] = 0;

	
	for(int i = 2; i < n + 2; i++){
		cin >> cir[i].x >> cir[i].y >> cir[i].z;
		mp[0][i] = len1(cir[i].x, cir[i].y, cir[i].z);
		mp[i][0] = mp[0][i];
		
		mp[1][i] = len2(cir[i].x, cir[i].y, cir[i].z);
		mp[i][1] = mp[1][i];
		for(int j = 2; j <= i; j++){
			double s = clen(cir[i], cir[j]);
			mp[i][j] = s;	
			mp[j][i] = mp[i][j];
		}
	}
	memset(vis, 0, sizeof(vis));
	
		int minn,k=-1;
		for(int i = 1 ; i < n + 2; i++)
		dis[i] = mp[0][i];
		dis[0] = 0;
		vis[0] = 1;
		for(int i = 1;i < n + 2;i++)//从1遍历到n
		{
			minn = INF; 
			for(int j = 1; j < n + 2; j++)//每次找到距离1最近且没有被标记的点
			{
				if(dis[j] < minn && !vis[j])
				{
					minn = dis[j];
					k = j;
				}
			}
			vis[k] = 1;//标记一下
			for(int j = 1; j < n + 2; j++)//松弛
	            if(!vis[j])//如果没有被标记且距离变小,就松弛一下
	            dis[j] = min(dis[j], dis[k] + mp[k][j]);//两个数的最小值
		}

	
	cout << dis[1] << endl; 
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值