力扣

第三题:设计食物评分系统

示例

输入
["FoodRatings", "highestRated", "highestRated", "changeRating", "highestRated", "changeRating", "highestRated"]
[[["kimchi", "miso", "sushi", "moussaka", "ramen", "bulgogi"], ["korean", "japanese", "japanese", "greek", "japanese", "korean"], [9, 12, 8, 15, 14, 7]], ["korean"], ["japanese"], ["sushi", 16], ["japanese"], ["ramen", 16], ["japanese"]]
输出
[null, "kimchi", "ramen", null, "sushi", null, "ramen"]

解释
FoodRatings foodRatings = new FoodRatings(["kimchi", "miso", "sushi", "moussaka", "ramen", "bulgogi"], ["korean", "japanese", "japanese", "greek", "japanese", "korean"], [9, 12, 8, 15, 14, 7]);
foodRatings.highestRated("korean"); // 返回 "kimchi"
                                    // "kimchi" 是分数最高的韩式料理,评分为 9 。
foodRatings.highestRated("japanese"); // 返回 "ramen"
                                      // "ramen" 是分数最高的日式料理,评分为 14 。
foodRatings.changeRating("sushi", 16); // "sushi" 现在评分变更为 16 。
foodRatings.highestRated("japanese"); // 返回 "sushi"
                                      // "sushi" 是分数最高的日式料理,评分为 16 。
foodRatings.changeRating("ramen", 16); // "ramen" 现在评分变更为 16 。
foodRatings.highestRated("japanese"); // 返回 "ramen"
                                      // "sushi" 和 "ramen" 的评分都是 16 。
                                      // 但是,"ramen" 的字典序比 "sushi" 更小。

思路

因为要返回某一类烹饪方式下评分最高的食物,就先想到用哈希表建立烹饪方式到评分和食物的映射,又评分要有序,所以想到用set,又因为要支持修改操作,修改一个食物的评分要修改要把set中的原评分删除,然后添加新的评分,删除操作已知的是食物,所以要建立食物到评分的映射,和食物到烹饪方式的映射。

代码

class FoodRatings {
public://struct Data {//    int rating;//    string food;//    bool operator< (const Data& t) const {//        if (rating != t.rating) return rating > t.rating;//        return food < t.food;//    }//};//unordered_map<string,set<Data>> hash;unordered_map<string,set<pair<int,string>>> hash;//烹饪方式->(评分 食物)unordered_map<string,string> cui;//食物->烹饪方式unordered_map<string,int> rat;//食物->评分FoodRatings(vector<string>& foods, vector<string>& cuisines, vector<int>& ratings) {for(int i=0;i<foods.size();i++){cui[foods[i]]=cuisines[i];rat[foods[i]]=ratings[i];hash[cuisines[i]].insert({-ratings[i],foods[i]});//放入负的评分 这样大的就可以排前面}//使用set因为set有序}void changeRating(string food, int newRating) {//把集合中原评分删除 现评分加入hash[cui[food]].erase({-rat[food],food});hash[cui[food]].insert({-newRating,food});rat[food]=newRating;}string highestRated(string cuisine) {return hash[cuisine].begin()->second;//return hash[cuisine].begin()->food;}//若使用结构体,评分就不用存负数
};/*** Your FoodRatings object will be instantiated and called as such:* FoodRatings* obj = new FoodRatings(foods, cuisines, ratings);* obj->changeRating(food,newRating);* string param_2 = obj->highestRated(cuisine);*/

第四题: 优质数对的数目

示例

输入:nums = [1,2,3,1], k = 3
输出:5
解释:有如下几个优质数对:
- (3, 3):(3 AND 3) 和 (3 OR 3) 的二进制表示都等于 (11) 。值为 1 的位数和等于 2 + 2 = 4 ,大于等于 k = 3 。
- (2, 3) 和 (3, 2): (2 AND 3) 的二进制表示等于 (10) ,(2 OR 3) 的二进制表示等于 (11) 。值为 1 的位数和等于 1 + 2 = 3 。
- (1, 3) 和 (3, 1): (1 AND 3) 的二进制表示等于 (01) ,(1 OR 3) 的二进制表示等于 (11) 。值为 1 的位数和等于 1 + 2 = 3 。
所以优质数对的数目是 5 。

思路

如果 num1 在数组中至少出现 一次 ,则满足 num1 == num2 的数对 (num1, num2) 也可以是优质数对。也就是说一个数只要出现了,那出现多少次都没区别,所以可以先去重。

至于两数与运算和或运算后1的个数之和

举例               或运算           与运算

10100            11101             00100

01101

发现

若两数该位为11   则计算后总的1的个数加2

若两数该位为10或01  则计算后总的1的个数加1

若两数该位为00   则计算后总的1的个数加0

所以两数做与运算后1的个数+做或运算后1的个数之和等于做运算前两数1的个数之和

所以就把问题转化为两数1的个数之和大于等于k的数对的个数

代码

class Solution {
public:long long countExcellentPairs(vector<int>& nums, int k) {typedef long long LL;sort(nums.begin(),nums.end());nums.erase(unique(nums.begin(),nums.end()),nums.end());int cnt[30]={0};//2^30略大于10^9 所以最多有30个1for(auto x:nums){int s=0;while(x) x&=(x-1),s++;//计算1的个数cnt[s]++;//记录 1的个数为s的数有多少个}LL res=0;for(int i=0;i<30;i++)//枚举ifor(int j=max(k-i,0);j<30;j++)//再找满足大于等于k条件的能够与i配对的jres+=(LL)cnt[i]*cnt[j];//满足条件1的个数为i和j的数的个数相乘即为所有配对方案return res;}
};

AcWing

第二题:指针

示例

3

10

20

30

思路

因为一个角度顺时针拨动,要么逆时针拨动,且数据范围在25以内,所以可以用二进制枚举。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=20;
int a[N];
int main()
{int n;cin >> n;int sum=0;for(int i=0;i<n;i++){cin >> a[i];sum+=a[i];}bool flag=false;for(int i=0;i<1<<n;i++){//二进制表示的i中1表示顺时针 0表示逆时针int tmp=0;for(int j=0;j<n;j++){if((i>>j)&1){tmp+=a[j];}}if(((sum-2*tmp)%360+360)%360==0){//若顺时针和逆时针拨动的角度模360不为0 则无法复原puts("YES");flag=true;break;}}if(!flag) puts("NO");return 0;
}

第三题:画圆

示例

共一行,包含 5 个整数 R,x1,y1,x2,y2。

5 3 3 1 1

3.767767  3.767767  3.914214

思路

把图画出来后就不难发现,若要满足题目的条件,画的圆的圆心一定在给定点和给定圆圆心连线的延长线上,直径为给定点到延长线与给定圆交点的长度,又因为知道给定圆的半径,所以给定圆圆心到画圆圆心的距离等于给定圆半径减去画圆半径,又三点一线,可以用向量求画圆圆心的位置,这样误差也比平方的求法小。(说了这么多废话,画个图就明白了)

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include<cmath>
using namespace std;
int main()
{double R,x1,y1,x2,y2;cin >> R>>x1>>y1>>x2>>y2;double z=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));if(x1==x2&&y1==y2){printf("%.6lf %.6lf %.6lf",x1+R/2,y1,R/2);return 0;}if(z>=R){printf("%.6lf %.6lf %.6lf",x1,y1,R);}else{double ra=(z+R)/2;//画圆的半径double d=R-ra;//画圆圆心到给定圆圆心的距离//因为三点在一条直线上且已知两点和线段的比例关系 使用向量double tx=x1-x2,ty=y1-y2;//向量(x1->x2,y1->y2)与向量(x->x1,y->y1)的比值是z:d//则向量(x->x1,y->y1)为(tx/z*d,ty/z*d) 则x,y分别(x1+tx/z*d,y1+ty/z*d)x1+=tx/z*d,y1+=ty/z*d;printf("%.6lf %.6lf %.6lf", x1, y1, ra);}
}

力扣第303场周赛补题相关推荐

  1. 力扣第314场周赛补题

    1.题目:6200. 处理用时最长的那个任务的员工 - 力扣(LeetCode) 思路:两个数组记录处理时间与结果,通过遍历最长时间 class Solution { public:int harde ...

  2. 以赛促练-力扣第303场周赛反思

    从这周开始继续打周赛,尝试以赛促练,以后也想专门记录一下每周周赛一些我不会的题目,以及别人好的思路. 这次又只AC了前两题,基本上就是模拟,没有什么好说的.第三题本来一眼看以为是区间修改,线段树,结果 ...

  3. <力扣第292场周赛第一题>6056. 字符串中最大的 3 位相同数字

    前言 人生如逆旅,我亦是行人.----苏轼<临江仙·送钱穆父> 一.题: 给你一个字符串 num ,表示一个大整数.如果一个整数满足下述所有条件,则认为该整数是一个 优质整数 : 该整数是 ...

  4. <力扣第292场周赛第二题>6057. 统计值等于子树平均值的节点数

    前言 人生如逆旅,我亦是行人.----苏轼<临江仙·送钱穆父> 一.题: 给你一棵二叉树的根节点 root ,找出并返回满足要求的节点数,要求节点的值等于其 子树 中值的 平均值 . 注意 ...

  5. 当单调栈遇到了前前缀和(Leetcode 2281. 巫师的总力量和、力扣第 294 场周赛第 4 题)

    2281. 巫师的总力量和(力扣第 294 场周赛第 4 题) 这道题做起来比较复杂.需要单调栈.前缀和.数学计算. 一句话概括思路:在 907. 子数组的最小值之和 中,是对每个 min 乘以管辖范 ...

  6. Leetcode第321场周赛补题

    Leetcode第321场周赛补题 第一题:6245. 找出中枢整数 - 力扣(LeetCode) 分析:由于数组中是差值为1的等差数列,所以可以直接用等差数列求和公式的朴素法更加简便的解决这题,,其 ...

  7. 20220307:力扣第283场周赛(上)

    力扣第283场周赛(上) 题目 思路与算法 代码实现 写在最后 题目 Excel 表中某个范围内的单元格 向数组中追加 K 个整数 思路与算法 第一题直接模拟即可,注意作为char的数字也是可以直接自 ...

  8. 20220228:力扣第282场周赛(下)

    力扣第282场周赛(下) 题目 思路与算法 代码实现 写在最后 题目 完成旅途的最少时间 完成比赛的最少时间 思路与算法 完成旅途的最少时间: 二分模板题,注意初始化左右边界的话,速度会提升很多. 完 ...

  9. 20220227:力扣第282场周赛(上)

    力扣第282场周赛(上) 题目 思路与算法 代码实现 写在最后 题目 统计包含给定前缀的字符串 使两字符串互为字母异位词的最少步骤数 思路与算法 第二题直接并集减去交集,简单的集合运算,当然也可以换C ...

最新文章

  1. Mac OS X下使用C++ JSON库
  2. 远程监督关系抽取漫谈:结合知识图谱和图神经网络
  3. C#中的依赖注入那些事儿
  4. UESTC_秋实大哥与快餐店 2015 UESTC Training for Data StructuresProblem C
  5. 一分钟明确 VS manifest 原理
  6. matlab瓶盖盖严检查,盖检机|瓶盖检测|外观检测设备|誉阵科技
  7. string字符串转实体类_【Recursion】(6)实战练习:使用递归处理字符串
  8. 黑客Alex Tapanaris与PDF文档
  9. 2016,我似乎明白了
  10. DRBD+Heratbeat+NFS高可用文件共享存储
  11. UCHome二次开发:uchome文件体系介绍
  12. 2022吴恩达机器学习课程学习笔记(第二课第一周)
  13. linux网卡dhcp获取ip,Linux下通过DHCP服务器获取IPv6地址
  14. 计算机Excel运行环境,Excel2007免费完整版 最新电脑版
  15. clickhouse之数据存储:JBOD vs RAID
  16. 1050Ti 安装CUDA、cuDNN
  17. “字体arial不支持样式regular“的解决方法
  18. 2023年全国最新会计专业技术资格精选真题及答案15
  19. 计算机室内设计绘图论文,室内装饰设计论文参考文献范例借鉴
  20. Tensorboard可视化

热门文章

  1. Solidity智能合约开发(应用篇)
  2. 免费快递物流信息查询接口
  3. VisualFreeBasic介绍(VB6的进阶编程语言)
  4. javascript 正则匹配
  5. Linux vsftpd 内网服务器 被动模式配置外网访问 部分填坑
  6. 记ATTCK实战系列——红队实战(三)红日靶场
  7. BWA源码阅读笔记(二)索引文件amb/ann/pac文件是什么?
  8. 由高通8295车规级芯片算力TOPS想起车载常用嵌入式系统的TOPS
  9. 金蝶K/3插件 - 单个单据显示
  10. Java中的Map【二】SortedMap接口