2022.12.1#2 B3678 B3679

目录

  • [语言月赛202211] Gold-Purple-Blue-Green-White
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 样例 1 解释
      • 数据规模与约定
    • 分析
    • 代码
  • [语言月赛202211] Zone Selection
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
    • 分析
    • 代码

[语言月赛202211] Gold-Purple-Blue-Green-White

题目背景

扶苏在玩一款名叫第五暖暖的游戏。

题目描述

扶苏在游戏中的角色有一个被称为「精神力」的属性,初始时,这一属性为 x 0 x_0 x0

扶苏的仓库里有 n n n 件挂件,对于第 i i i 件挂件,只有当人物的精神力不低于 a i a_i ai 时才能装备该挂件,装备该挂件后,人物的精神力会增加 b i b_i bi

现在,扶苏希望按照 1 1 1 n n n 的顺序依次尝试装备每件挂件。策略是:当尝试装备某件挂件时,如果满足装备该挂件的条件(也就是人物的精神力不低于 a i a_i ai),则装备该挂件(此时人物的精神力会增加 b i b_i bi);否则不装备该挂件,以后也不再考虑该挂件。

请你求出,扶苏一共装备了几件挂件。

输入格式

第一行是两个整数,表示挂件数量 n n n 和初始的精神力 x 0 x_0 x0
第二行有 n n n 个整数,第 i i i 个整数表示装备挂件 i i i 最少需要的精神力值 a i a_i ai
第三行有 n n n 个整数,第 i i i 个整数表示装备挂件 i i i 后增加的精神力值 b i b_i bi

输出格式

输出一行一个整数,表示扶苏装备的挂件数量。

样例 #1

样例输入 #1

3 1
1 3 2
1 1 1

样例输出 #1

2

提示

样例 1 解释

初始扶苏的精神力为 1 1 1
她开始考虑第一件挂件,装备第一件挂件需要的精神力不低于 1 1 1,符合要求,故她装备了第一件挂件,精神力增加 1 1 1,变成 2 2 2
考虑第二件挂件,要求精神力不低于 3 3 3,不符合条件,于是不装备该挂件。
考虑第三件挂件,要求精神力不低于 2 2 2,此时精神力是 2 2 2,符合要求,故装备该挂件,精神力增加 1 1 1,变成 3 3 3
需要注意的是,虽然此时已经可以装备第二件挂件,但是第二件挂件已经被考虑过了,所以我们不再尝试装备上它。
最终,扶苏装备了两件挂件。

数据规模与约定

  • 对于 10 % 10\% 10% 的数据,保证 x 0 < min ⁡ i = 1 n a i x_0 < \min\limits_{i = 1}^n a_i x0<i=1minnai
  • 对于另外 10 % 10\% 10% 的数据,保证 n = 1 n = 1 n=1
  • 对于另外 20 % 20\% 20% 的数据,保证 b i = 0 b_i = 0 bi=0
  • 对于另外 20 % 20\% 20% 的数据,保证 a i < a i + 1 a_i < a_{i + 1} ai<ai+1(对 1 ≤ i < n 1 \leq i < n 1i<n);
  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105 0 ≤ a i , b i , x 0 ≤ 1 0 9 0 \leq a_i, b_i,x_0 \leq 10^9 0ai,bi,x0109

By 一扶苏一

分析

依题意模拟。

代码

#include
using namespace std;
long long n,x,a[100100],b[100100],ans=0;
int main()
{
	cin>>n>>x;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++)
	{
		if(x>=a[i])
		{
			x+=b[i];
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

[语言月赛202211] Zone Selection

题目描述

在第五人格巅峰七阶及以上的排位赛中,需要进行区域选择。我们将在本题中形式化、推广化的解决区域选择问题。

在地图中,共有 n n n 台密码机,第 i i i 台密码机的坐标为 ( x i , y i ) (x_i,y_i) (xi,yi)。在推广化的游戏中,有 k k k 名求生者。每名求生者可以选择一台密码机作为其出生点,我们称被选择的密码机为 出生密码机

监管者共有 T T T 个出生点可供选择。第 i i i 个可能的出生点坐标为 ( x i , y i ) (x_i,y_i) (xi,yi)。此时,由于“封禁”天赋的存在,离监管者最远的密码机将不能被破译。

如果多台密码机与监管者的距离相同且最远,“封禁”天赋将会封禁这几台密码机中标号最小的那一台。

请问在该 T T T 个出生点中,有多少出生点,可以使某一台 出生密码机 被封禁。

请注意:坐标点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 与坐标点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2) 之间的距离为 ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} (x1x2)2+(y1y2)2

输入格式

输入共 n + T + k + 1 n+T+k+1 n+T+k+1 行。

输入的第一行为三个整数 n , k , T n,k,T n,k,T

接下来 n n n 行,每行两个整数 x i , y i x_i,y_i xi,yi,表示一台密码机的坐标。

接下来 k k k 行,每行两个整数 x i , y i x_i,y_i xi,yi,表示一名求生者选择出生密码机的坐标,保证该坐标在上面出现过。

接下来 T T T 行,每行两个整数 x i , y i x_i,y_i xi,yi,表示监管者的一个出生点。

输出格式

输出一行一个整数,为答案。

样例 #1

样例输入 #1

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

样例输出 #1

1

提示

【样例 #1 解释】

显然,第一台密码机和第四台密码机为出生密码机

第一位监管者与位置在 ( − 1 , 0 ) (-1, 0) (1,0) 的第一台密码机距离最远,为 4 4 4。因此,第一台密码机被封禁。

第二位监管者与位置在 ( 2 , 0 ) , ( 0 , 2 ) (2, 0), (0, 2) (2,0),(0,2) 的第三、四台密码机距离相同且最远,为 2 2 2。根据上面提到的规则,第三台密码机被封禁。

被封禁的出生密码机为 1 1 1 台。

【数据规模与约定】

对前 10 % 10\% 10% 的数据,保证 n = k = 1 n = k = 1 n=k=1

对前 20 % 20\% 20% 的数据,保证 n , k , t ≤ 10 n, k, t \leq 10 n,k,t10

对另外 20 % 20\% 20% 的数据,保证密码机与出生点的坐标中的 x x x 均为 0 0 0

对另外 10 % 10\% 10% 的数据,保证 n = k n = k n=k

对另外 10 % 10\% 10% 的数据,保证 T = 1 T = 1 T=1

对于 100 % 100\% 100% 的数据范围 1 ≤ k ≤ n ≤ 1 0 3 , 1 ≤ T ≤ 1 0 3 , 1 ≤ ∣ x i ∣ , ∣ y i ∣ ≤ 1 0 3 1 \le k \le n \le 10^3, 1 \le T \le 10^3, 1 \le |x_i|,|y_i| \le 10^3 1kn103,1T103,1xi,yi103

分析

用结构体来做。结构体数组里的每个数表示每个密码机,定义 x , y , e x,y,e x,y,e x , y x,y x,y 表示坐标, e e e b o o l bool bool 类型的,表示这个密码机是否为出生密码机。

剩下依题意模拟。

代码

#include
using namespace std;
long long n,k,t,ans=0;
struct mm
{
	int x,y;
	bool e;
}a[1100];
double jl(int a,int b,int a2,int b2)
{
	return sqrt(((a-a2)*(a-a2)+(b-b2)*(b-b2))*1.0);
}
int main()
{
	cin>>n>>k>>t;
	for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
	for(int i=1;i<=k;i++)
	{
		int xx,yy;
		cin>>xx>>yy;
		for(int j=1;j<=n;j++)
		{
			if(xx==a[j].x&&yy==a[j].y)
			{
				a[j].e=true;
				break;
			}
		}
	}
	for(int i=1;i<=t;i++)
	{
		int xx,yy;
		cin>>xx>>yy;
		double maxx=-1;
		int f=0;
		for(int j=1;j<=n;j++)
		{
			if(jl(xx,yy,a[j].x,a[j].y)>maxx)
			{
				maxx=jl(xx,yy,a[j].x,a[j].y);
				f=a[j].e;
			}
		}
		if(f) ans++;
	}
	cout<<ans;
	return 0;
}

你可能感兴趣的:(洛谷,算法,c++)