牛客周赛 Round 16 IOI (B、C题解)

2023-10-28 14:12
文章标签 16 牛客 round 周赛 题解 ioi

本文主要是介绍牛客周赛 Round 16 IOI (B、C题解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

B-小美打靶

一、题目要求

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

小美在训练场打靶,靶一共有 10 环,靶的中心位于 (0,0),如果打中的位置在以靶心为圆心,半径为 1 的圆内,则得 10 分,之后每向外一圈分数减 1,直到 1 分,每圈的半径都比上一圈大 1。即如果打中的位置在以靶心为圆心,半径为 i的圆内,则得 11−i分。
如果打中的位置不在任何一圈内,则得 0 分。

输入描述:

一行两个整数 x,y表示打中的位置坐标。
0≤x,y≤10

输出描述:

输出一个整数,表示得分。

示例1

输入

1 0

输出

10

示例2

输入

1 1

输出

9

二、思路

第一种方法:求出点(x,y)到(0,0)的距离,即double dis=sqrt(x*x+y*y); int k=(int)dis;

double s=dis-k*1.0;

1.先特判当x=0并且y=0的时候,输出10;

2.如果s=0,则说明该点落在坐标轴上,如果k>=11,输出0,否则输出11-k;如果s!=0,如果k+1>=11,则输出0,否则输出11-k-1;

第二种方法:int t=x*x+y*y;当t<=i*I的时候,直接输出11-i;

三、代码

第一种方法

#include <bits/stdc++.h>
using namespace std;
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int x,y;cin>>x>>y;if(x==0&&y==0) {cout<<10;return 0;}double dis=sqrt(x*x+y*y);int k=(int)dis;double s=dis-k*1.0;if(s!=0.0){if(k+1>=11) cout<<0<<endl;else//(10,1) 0cout<<11-(k+1);}else //判断点是否落在坐标轴上 {if(k>=11) cout<<0<<endl;else //(10,0) 1cout<<11-k<<endl;}return 0;
}

第二种方法

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
const int N=2e5+10;
const int inf=0x3f3f3f3f;
void solve()
{int x,y;cin>>x>>y;int i,j,f=0;int t=x*x+y*y;for(i=1;i<=10;i++){if(t<=i*i){f=1;cout<<11-i<<endl;break;}}if(f==0)cout<<0<<endl;
}
signed main()
{int t=1;while(t--){solve();}return 0;
}

C-小美打怪

一、题目要求

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

小美在玩游戏,游戏中有 n 个怪物,怪物的血量为 hi​,攻击力为 ai​。小美的血量为 H,攻击力为 A,小美可以击败血量和攻击力都小于自己的怪物,并且打败后血量降为怪物的血量,攻击力降为怪物的攻击力。小美想知道最多可以打败多少怪物。

输入描述:

第一行三个整数 n,H,A分别表示怪物的数量,小美的血量,小美的攻击力。
第二行 n 个整数 hi,表示怪物的血量。
第三行 n个整数 ai​,表示怪物的攻击力。
1≤n≤10^3
1≤ai,hi,H,A≤10^9

输出描述:

输出一个整数表示答案。

示例1

输入

3 4 5
1 2 3
3 2 1

输出

1

说明

最多只能击败一个怪物。

二、思路

1.排序,将血量从大到小进行排序,如果血量相等,攻击力高的放在前面

2.利用01背包思维,每次都可以选择放或者不放,每一步都走最优策略

3.利用f[i]记录第i个怪物下面有几个连续递减的血量和连续递减的攻击力的怪物的数量

4.f[i]的存储,是利用当第i个怪物(i=n;i>=1;i--),和i下面的怪物(j=i+1;j<=n;j++) 进行攻击力和血量的比较,只有当第i个怪物的血量高和攻击力都大于等于第j个怪物的时候,才能进行记录f[i]=max(f[i],f[j]+1),否则f[i]默认为0

例如 样例

5 10 9

10 2 8 9 3

8 7 6 5 4

f[i]记录的是,第i个字符有几个q[i].a连续递减,且q[i].h连续递减的数的个数
例如 10 8,9  5,3  4 ;10 9 3连续递减,8 5 4也连续递减 
i=5 f[5]=0;
i=4 f[4]=0;
i=3 f[3]=max((f[3],f[4]+1))=(0,1)=1;
i=2 f[2]=max(f[2],f[4]+1)=(0,1)=1;
i=1 f[1]=max(max(f[1],f[2]+1),max(f[1],f[3]+1),max(f[1],f[4]+1),max(f[1],f[5]+1))
        =max(2,2,1,1)=2;

三、代码

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
const int N=2e5+10;
const int inf=0x3f3f3f3f;
int n,H,A;
int f[N];
struct node
{int h,a;
} q[N];
bool cmp1(node l,node r)
{if(l.h==r.h)return l.a>r.a;return l.h>r.h;
}
void solve()
{cin>>n>>H>>A;int i,j,k=0,g;for(i=1; i<=n; i++){cin>>q[i].h;//血量 }for(i=1; i<=n; i++){cin>>q[i].a;//攻击力}sort(q+1,q+1+n,cmp1);//血量高的放在前面,如果血量相同,攻击力高的放在前面for(i=n;i>=1;i--)//i=3{for(j=i+1;j<=n;j++)//j=4,5;{if(q[i].a>q[j].a&&q[i].h>q[j].h){f[i]=max(f[i],f[j]+1);//f[3]=max(f[3],f[4]+1);f[3]=max(f[3],f[5]+1)}}}int ans=0;for(i=1;i<=n;i++){if(H>q[i].h&&A>q[i].a){ans=max(ans,f[i]+1);}}cout<<ans<<endl;
}
signed main()
{int t=1;while(t--){solve();}return 0;
}

这篇关于牛客周赛 Round 16 IOI (B、C题解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293767

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述