美团 2023年春招 技术综合-算法策略方向
创始人
2025-05-31 00:29:47

捕获

时间限制:3000MS
内存限制:589824KB

题目描述

小美在玩一项游戏。该游戏的目标是尽可能抓获敌人。
敌人的位置将被一个二维坐标(x, y)所描述。
小美有一个全屏技能,该技能能一次性将若干敌人一次性捕获。
捕获的敌人之间的横坐标的最大差值不能大于A,纵坐标的最大差值不能大于B。
现在给出所有敌人的坐标,你的任务是计算小美一次性最多能使用技能捕获多少敌人。

输入描述

第一行三个整数N,A,B,表示共有N个敌人,小美的全屏技能的参数A和参数B。
接下来N行,每行两个数字x,y,描述一个敌人所在的坐标。
1≤N≤500,1≤A,B≤1000,1≤x,y≤1000。

输出描述

一行,一个整数表示小美使用技能单次所可以捕获的最多数量。

样例输入

3 1 1
1 1
1 2
1 3

样例愉出

2

思路:这道题如果直接在二维数组中标点并进行统计的话,由于图坐标范围比较大,因此不太可靠,同时点数相对二维图的大小来说过于少了。换个思路,其实只需要对每个点统计这个点作为左上、左下、右上、右下点时包含的数量即可,每次加入第i个点的时候,和前面i-1个点计算一下并维护一下各自的四个值。举例来说,如果一个点i作为左上角时包含一个点t,那么t作为右下角时一定也会包含点i,当然值得注意的是这个不能说明点i作为左上角和点t作为右下角对应的矩形是相同的,只能说各自在对方的包含域里而已。

#include
#include
using namespace std;struct Point{int x, y, left_up_num, left_down_num, right_up_num, right_down_num;
};const int maxn = 5e2 + 5;
Point points[maxn];int main(){int N, A, B, x, y, idx, pre_idx, max_num = 0, diff_x, diff_y;cin >> N >> A >> B;for(idx = 0; idx < N; ++ idx){cin >> x >> y;points[idx] = Point{x, y, 1, 1, 1, 1};for(pre_idx = 0; pre_idx < idx; ++ pre_idx){diff_x = points[idx].x - points[pre_idx].x;diff_y = points[idx].y - points[pre_idx].y;if(abs(diff_x) > A || abs(diff_y) > B){continue;}//由于存在共线即diff_x = 0或diff_y = 0的情况 因此不能直接else  if(diff_x <= 0 && diff_y <= 0){// 当前点作为左上角  对应点作为右下角 //cout << "(" << points[idx].x << "," << points[idx].y << ")" << "作为左上角 包含(" << points[pre_idx].x << "," << points[pre_idx].y << ")" << endl;++ points[idx].left_up_num;++ points[pre_idx].right_down_num;max_num = max(max_num, max(points[idx].left_up_num, points[pre_idx].right_down_num));}if(diff_x >= 0 && diff_y <= 0){// 当前点作为左下角  对应点作为右上角 //cout << "(" << points[idx].x << "," << points[idx].y << ")" << "作为左下角 包含(" << points[pre_idx].x << "," << points[pre_idx].y << ")" << endl;++ points[idx].left_down_num;++ points[pre_idx].right_up_num;max_num = max(max_num, max(points[idx].left_down_num, points[pre_idx].right_up_num));}if(diff_x <= 0 && diff_y >= 0){// 当前点作为右下角  对应点作为左下角 //cout << "(" << points[idx].x << "," << points[idx].y << ")" << "作为右下角 包含(" << points[pre_idx].x << "," << points[pre_idx].y << ")" << endl;++ points[idx].right_down_num;++ points[pre_idx].left_up_num;max_num = max(max_num, max(points[idx].right_down_num, points[pre_idx].left_up_num));}if(diff_x >= 0 && diff_y >= 0){// 当前点作为右上角  对应点作为左下角 //cout << "(" << points[idx].x << "," << points[idx].y << ")" << "作为右上角 包含(" << points[pre_idx].x << "," << points[pre_idx].y << ")" << endl;++ points[idx].right_up_num;++ points[pre_idx].left_down_num;max_num = max(max_num, max(points[idx].right_up_num, points[pre_idx].left_down_num));}}//cout << "左上 左下 右上 右下" << endl;for(pre_idx = 0; pre_idx <= idx; ++ pre_idx){cout << "  " << points[idx].left_up_num << "    " << points[idx].left_down_num << "    " << points[idx].right_up_num << "    " << points[idx].right_down_num << endl;}}cout << max_num; 
}

彩带

时间限制:3000MS

内存限制:589824KB

题目描述

小美现在有一串彩带,假定每一厘米的彩带上都是一种色彩。
因为任务的需要,小美希望从彩带上截取一段,使得彩带中的颜色数量不超过K种。
显然,这样的截取方法可能非常多。于是小美决定尽量长地截取一段。
你的任务是帮助小美截取尽量长的一段,使得这段彩带上不同的色彩数量不超过K种。

输入描述

第一行两个整数N,K,以空格分开,分别表示彩带有N厘米长,你截取的一段连续的彩带不能超过K种颜色。
接下来一行N个整数,每个整数表示一种色彩,相同的整数表示相同的色彩。1≤N,K<5000,彩带上的颜色数字介于[1,2000]之间。

输出描述

一行,一个整数,表示选取的彩带的最大长度。

样例输入

8 3
1 2 3 2 1 4 5 1

样例输出

5

思路:我们对于每一种颜色记录该颜色上一次出现的位置,初始的时候,所有颜色的上一次出现位置为0。我们每次读取一个新的颜色,并判断当前颜色是否在已包含的颜色集合里,如果不存在,则增加一个颜色数量,同时判断数量是否超过K,如果超过,则在已有颜色里找到上一次出现位置最靠前的踢出集合,并将区间左端点(彩带最左端的前一个位置)移动到该位置,同时维护答案。

#include
#include
using namespace std;
const int maxn = 5e3 + 5;map color_idx_map; // idx:color 因为需要删除最靠前的颜色 
map::iterator color_idx_map_iter;
int color_pre_idx[maxn];
bool color_in_set[maxn]; int main(){int N, K, idx, left = 0, color, color_num = 0, pre_idx, interval_max_len = 0, first_color;cin >> N >> K;for(idx = 1; idx <= N; ++ idx){cin >> color;if(!color_in_set[color]){//未在集合中 ++ color_num;color_pre_idx[color] = idx; color_in_set[color] = true;color_idx_map[idx] = color;if(color_num > K){//如果颜色数量超过K 扔掉第一个颜色 left = color_idx_map.begin() -> first;first_color = color_idx_map.begin() -> second;color_idx_map.erase(color_idx_map.begin());color_in_set[first_color] = false;}}else{//在集合中 更新集合内部维护的左端点顺序 pre_idx = color_pre_idx[color];color_idx_map_iter = color_idx_map.find(pre_idx);color_idx_map.erase(color_idx_map_iter);color_idx_map[idx] = color;} //经过上面的操作 现在的区间满足颜色个数不超过K个 可以直接更新答案 interval_max_len = max(interval_max_len, idx - left);}	 cout << interval_max_len;return 0;
} 

回文串

时间限制:3000MS
内存限制:589824KB

题目描述

现在小美获得了一个字符串。小羊想要使得这个字符串是回文串。
小美找到了你。你可以将字符串中至多两个位置改为任意小与英文字符'a'-'z'。
你的任务是帮助小美在当前制约下,获得字典序最小的回文字符串。
数据保证能在题目限制下形成回文字符串。
注:回文字符串:即一个字符串从前向后和从后向前是完全一致的字符串。
例如字符串ababa, aaaa,acca都是回文字符串。字符串abed, acea都不是回文字符串

输入描述

一行,一个字符串,字符串中仅由小写英文字符构成。
保证字符串不会是空字符串。
字符串长度介于[1, 100000]之间。

输出描述

一行,一个在题目条件限制下所可以获得的字典序最小的回文字符串。

样例输入

acca

样例输出

aaaa

思路:字符串,扫一遍看多少个位置不同

        A、如果没有位置不同,从头开始尝试变a,如果头已经是a,就考虑下一个,以此类推。

        B、如果只有一个位置不同,考虑前面部分的是不是a

                1、如果前面的是a,把后面的变a;现在还剩一次改动机会,需要考虑串的字符数是奇数还是偶数。如果是奇数,考虑把中心字符改为a;如果为偶数,则没法动,因为如果想把下一位改a,由于它们已经回文,要么本来就是a无需更改,要么两个相等且不为a,要同时改两个。

                2、如果前面的不是a,把前面的改为a后,若后面对应位置的也不为a,则后面的也改为a,用完两次机会。否则在为奇数串的情况下改中心字符为a。 

                总结来说:优先把不同的位置都变为a,如果有多余的机会,看是否可以改中心。

        C、如果有两个位置不同,对于每个不同的位置,考虑把字典序大的改成小的,因为如果前面的字典序大,改小更好,如果前面的字典序小,那只能选择把后面的改小。

#include
#include
#include
using namespace std;
int main(){string str;cin >> str;int str_len = str.length(), left = 0, right = str_len - 1, not_equal_num = 0, idx;vector not_equal_idx;while(left < right){if(str[left] != str[right]){++ not_equal_num;not_equal_idx.push_back(left);	not_equal_idx.push_back(right);} ++ left;-- right;}if(not_equal_num == 0){//没有不同 left = 0, right = str_len - 1;while(left < right){if(str[left] != 'a'){str[left] = str[right] = 'a';break;} ++ left;-- right;} }else if(not_equal_num == 1){//1个不同 left = not_equal_idx[0];right = not_equal_idx[1];str[left] = str[right] = min(str[left], str[right]);if(str_len & 1){str[str_len >> 1] = 'a';}}else{//2个不同 for(idx = 0; idx <= 2; idx += 2){left = not_equal_idx[idx];right = not_equal_idx[idx + 1];str[left] = str[right] = min(str[left], str[right]);}} cout << str;return 0;
}

相关内容

热门资讯

联动云租一天多少钱(联动云租一... 本篇文章极速百科给大家谈谈联动云租一天多少钱,以及联动云租一天怎么划算对应的知识点,希望对各位有所帮...
飞机托运收费(飞机托运收费多少... 本篇文章极速百科给大家谈谈飞机托运收费,以及飞机托运收费多少钱一公斤对应的知识点,希望对各位有所帮助...
挡泥板(挡泥板是什么意思) 挡... 本篇文章极速百科给大家谈谈挡泥板,以及挡泥板是什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏...
滴滴专车官网(滴滴专车司机网站... 今天给各位分享滴滴专车官网的知识,其中也会对滴滴专车司机网站进行解释,如果能碰巧解决你现在面临的问题...
路特斯跑车(路特斯跑车多少钱一... 今天给各位分享路特斯跑车的知识,其中也会对路特斯跑车多少钱一辆2023款进行解释,如果能碰巧解决你现...
丰田致享新车报价(丰田致享20... 今天给各位分享丰田致享新车报价的知识,其中也会对丰田致享2021款报价进行解释,如果能碰巧解决你现在...
聊城到潍坊的汽车(聊城到潍坊的... 本篇文章极速百科给大家谈谈聊城到潍坊的汽车,以及聊城到潍坊的汽车票价多少对应的知识点,希望对各位有所...
没有身份证怎么买票(没有身份证... 今天给各位分享没有身份证怎么买票的知识,其中也会对没有身份证怎么买票进行解释,如果能碰巧解决你现在面...
2018科目三灯光详细表(20... 本篇文章极速百科给大家谈谈2018科目三灯光详细表,以及2018科目三最新模拟灯光考试20组不重复完...
五菱之光v(五菱之光v和五菱之... 今天给各位分享五菱之光v的知识,其中也会对五菱之光v和五菱之光有什么区别进行解释,如果能碰巧解决你现...
摩托车怠速(摩托车怠速多少转正... 今天给各位分享摩托车怠速的知识,其中也会对摩托车怠速多少转正常进行解释,如果能碰巧解决你现在面临的问...
武汉到西安(武汉到西安火车时刻... 今天给各位分享武汉到西安的知识,其中也会对武汉到西安火车时刻表查询进行解释,如果能碰巧解决你现在面临...
五菱之光v图片(五菱之光v新车... 今天给各位分享五菱之光v图片的知识,其中也会对五菱之光v新车报价进行解释,如果能碰巧解决你现在面临的...
郑州到重庆火车(郑州到重庆火车... 本篇文章极速百科给大家谈谈郑州到重庆火车,以及郑州到重庆火车多少钱一张对应的知识点,希望对各位有所帮...
学生证优惠区间(学生证优惠区间... 今天给各位分享学生证优惠区间的知识,其中也会对学生证优惠区间没有盖章进行解释,如果能碰巧解决你现在面...
武汉到合肥(武汉到合肥多少公里... 今天给各位分享武汉到合肥的知识,其中也会对武汉到合肥多少公里进行解释,如果能碰巧解决你现在面临的问题...
软座座位分布图(k8412软座... 本篇文章极速百科给大家谈谈软座座位分布图,以及k8412软座座位分布图对应的知识点,希望对各位有所帮...
长安逸动dt(长安逸动dt空调... 本篇文章极速百科给大家谈谈长安逸动dt,以及长安逸动dt空调滤芯拆卸教程对应的知识点,希望对各位有所...
西安到达州(西安到达州火车时刻... 本篇文章极速百科给大家谈谈西安到达州,以及西安到达州火车时刻表查询对应的知识点,希望对各位有所帮助,...
野马蝰蛇(野马蝰蛇gt500图... 本篇文章极速百科给大家谈谈野马蝰蛇,以及野马蝰蛇gt500图片对应的知识点,希望对各位有所帮助,不要...
高速obu是什么意思(收费站o... 今天给各位分享高速obu是什么意思的知识,其中也会对收费站obu是什么意思进行解释,如果能碰巧解决你...
西安北站在哪(西安北站在哪进站... 今天给各位分享西安北站在哪的知识,其中也会对西安北站在哪进站进行解释,如果能碰巧解决你现在面临的问题...
汽车搭电一次多少钱(汽车搭电大... 今天给各位分享汽车搭电一次多少钱的知识,其中也会对汽车搭电大概多少钱进行解释,如果能碰巧解决你现在面...
宝马跑车敞篷价格(宝马跑车敞篷... 本篇文章极速百科给大家谈谈宝马跑车敞篷价格,以及宝马跑车敞篷价格图片对应的知识点,希望对各位有所帮助...
cbr650r(cbr650r... 本篇文章极速百科给大家谈谈cbr650r,以及cbr650r座高对应的知识点,希望对各位有所帮助,不...
在哪买机票最便宜(在哪买机票最... 今天给各位分享在哪买机票最便宜的知识,其中也会对在哪买机票最便宜票进行解释,如果能碰巧解决你现在面临...
etc办理点(etc办理点节假... 今天给各位分享etc办理点的知识,其中也会对etc办理点节假日休息吗进行解释,如果能碰巧解决你现在面...
宝马1181报价及图片(宝马1... 今天给各位分享宝马1181报价及图片的知识,其中也会对宝马1181报价及图片及价格进行解释,如果能碰...
限行处罚扣分吗(限行被扣分吗)... 本篇文章极速百科给大家谈谈限行处罚扣分吗,以及限行被扣分吗对应的知识点,希望对各位有所帮助,不要忘了...
车车(车车车念什么) 车车 车... 今天给各位分享车车的知识,其中也会对车车车念什么进行解释,如果能碰巧解决你现在面临的问题,别忘了关注...