力扣 第474场周赛

Q1. 找出缺失的元素
签到题,排序之后一个一个找就行。

 1 class Solution {
 2 public:
 3     vector<int> findMissingElements(vector<int>& nums) {
 4         sort(nums.begin(),nums.end());
 5         vector<int> res;
 6         for(int i=0;i<nums.size()-1;i++){
 7             for(int j=nums[i]+1;j<nums[i+1];j++){
 8                 res.push_back(j);
 9             }
10         }
11         return res;
12     }
13 };

 Q2. 一次替换后的三元素最大乘积

给nums,能改一个元素(改成-1e5~1e5),获得三个元素的最大乘积。

排序之后,三种情况,最小的两个,最大的两个,或者首尾两端各一个。

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        nums.sort()
        a,b,c=nums[0]*nums[1],nums[-1]*nums[-2],nums[0]*nums[-1]
        print(a,b,c)
        res=0
        res=max(res,abs(a)*100000)
        res=max(res,abs(b)*100000)
        res=max(res,abs(c)*100000)
        return res

Q3. 完成所有送货任务的最少时间

两个无人机,分别要送di个物品,而且在ri倍数时不能送货,问完成送货任务的最少时间。

首先,时间越长越能完成任务,那么我们可以二分时间来求完成任务的最少时间。

那么给定时间t,我们如何判断在该时间内是否能完成任务呢?

第一台无人机在1~t能送货的时间为t - t // d1,同理,第二台t - t // d2.

此外,lcm(r1,r2)的倍数时间时,d1和d2都不能送货,我们同时需要保证d1+d<= t - t // lcm(r1,r2)。

如果有三个无人机,则需要加上三个判定条件。d2+d3 <= t - t // lcm(r2,r3),....,d1+d2+d3 <= t - t // lcm(r1,r2,r3)

 1 class Solution:
 2     def minimumTime(self, d: List[int], r: List[int]) -> int:
 3         left,right=0,1
 4         def check(t,d1,d2,r1,r2):
 5             if d1>t-t//r1:
 6                 return False
 7             if d2>t-t//r2:
 8                 return False
 9             if d1+d2>t-t//lcm(r1,r2):
10                 return False
11             return True
12         while not check(right,d[0],d[1],r[0],r[1]):
13             right<<=1
14         while left<right:
15             mid=left+right>>1
16             if check(mid,d[0],d[1],r[0],r[1]):
17                 right=mid
18             else:
19                 left=mid+1
20         return left
要求s的严格大于target的最小回文排列。
用回溯来写能清晰一点,和之前周赛的一个t4很像,之前是用循环来写的,这里循环非常不好写,所以浪费了好多时间去改。
每个i直接从target[i]开始枚举,保证大于等于target,如果填过一个大于target[i]的字母,那么后面的就能直接fill_min了。
 1 class Solution {
 2 public:
 3     bool can_pal(int n,vector<int>& cnt){
 4         int odd=0;
 5         for(int i=0;i<cnt.size();i++){
 6             if(cnt[i]%2)
 7                 odd++;
 8         }
 9         return n%2==0?odd==0:odd==1;
10     }
11     string lexPalindromicPermutation(string s, string target) {
12         vector<int> cnt(26,0);
13         int n=s.size();
14         for(int i=0;i<s.size();i++){
15             cnt[s[i]-'a']++;
16         }
17         if(!can_pal(n,cnt))
18             return "";
19         string ans(n,'?');
20         auto fillmin=[&](int k,vector<int> cnt){
21             int i=k,j=n-k-1;
22             while(i<j){
23                 int c=0;
24                 while(c<26&&cnt[c]<2)
25                     c++;
26                 if(c==26) return false;
27                 ans[i]=ans[j]=char(c+'a');
28                 cnt[c]-=2;
29                 i++,j--;
30             }
31             if(i==j){
32                 int c=0;
33                 while(c<26&&cnt[c]==0)
34                     c++;
35                 if(c==26)
36                     return false;
37                 ans[i]=char(c+'a');
38             }
39             return true;
40         };
41         function<bool(int)> dfs=[&](int i)->bool{
42             int j=n-i-1;
43             if(i>j) return ans>target;
44             char st=target[i];
45             for(char c=st;c<='z';c++){
46                 int need=(i==j?1:2);
47                 int id=c-'a';
48                 if(cnt[id]<need) continue;
49                 cnt[id]-=need;
50                 ans[i]=ans[j]=c;
51                 if(c==target[i]){
52                     if(dfs(i+1)) return true;
53                 }else{
54                     string backans=ans;
55                     if(fillmin(i+1,cnt)) return true;
56                     ans=backans;
57                 }
58                 cnt[id]+=need;
59             }
60             ans[i]=ans[j]='?';
61             return false;
62         };
63         return dfs(0)?ans:"";
64     }
65 };

 

posted on 2025-11-02 14:43  greenofyu  阅读(6)  评论(0)    收藏  举报