题目描述
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
#include
#include
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;
}
题目描述
开司正在与另外一人玩石头剪刀布。双方各有一些代表石头、剪刀、布的卡牌,每局两人各出一张卡牌,根据卡牌的内容决定这一局的胜负。胜负规则为:石头赢剪刀、剪刀赢布、布赢石头、相同为平局。每张卡牌至多被使用一次。
已知双方的卡牌数量,问开司最多赢几局?
输入描述
一行六个数字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
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;
}
题目描述
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=ri2。角色在直线上、圆上、圆内行走不消耗体力。在其他位置上由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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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;
}