leetcode周赛 243

A:水题。

https://leetcode-cn.com/problems/check-if-word-equals-summation-of-two-words/

 1 class Solution {
 2 public:
 3     int tans(string s){
 4         int res=0;
 5         for(int i=0;i<s.size();i++){
 6             res=res*10+s[i]-'a';
 7         }
 8         return res;
 9     }
10     bool isSumEqual(string a, string b, string tar) {
11         if(tans(a)+tans(b)==tans(tar)) return true;
12         return false;
13     }
14 };

B:给定一个数字字符串(可正可负)和一个在1~9之间的数x,问将x插入后,最大值为多少。

贪心,如果是正数,就希望高位尽可能大,否则就是高位尽可能小。

假设某正数为abcdef,其中a>b,x>b,那么最好方案必然是axbcdef。(可以证明将x放在其他任何地方,都比这要小)

负数同理可证。

 1 class Solution {
 2 public:
 3     string maxValue(string n, int x) {
 4         string res="";
 5         int l=0,r=n.size()-1;
 6         if(n[0]=='-'){
 7             l+=1;    
 8         }
 9         if(n[0]!='-'){
10             for(int i=l;i<=r;i++){
11                 if(n[i]-'0'<x&&x!=-1)
12                 {
13                     res+=x+'0';
14                     x=-1;
15                 }
16                 res+=n[i];
17             }
18             if(x!=-1)
19                 res+=x+'0';
20         }else if(n[0]=='-'){
21             res+='-';
22             for(int i=l;i<=r;i++){
23                 if(n[i]-'0'>x&&x!=-1)
24                 {
25                     res+=x+'0';
26                     x=-1;
27                 }
28                 res+=n[i];
29             }
30             if(x!=-1)
31                 res+=x+'0';
32         }
33         return res;
34     }
35 };

C:https://leetcode-cn.com/problems/process-tasks-using-servers/

可以将服务器分为空闲和忙碌两种状态。

  空闲服务器有的操作:找到权值最小的服务器,删除(进入工作状态),添加(工作完成),故可以用堆来维护

  忙碌服务器有的操作:找到最先完成的服务器,删除(完成任务),添加(进入工作状态),同样可以用堆来维护。

 1 typedef long long LL;
 2 class Solution {
 3 public:
 4     struct node1{//空闲服务器堆中的点
 5         LL id,w,t;
 6         bool operator<(const node1 tmp) const {
 7             if(w==tmp.w) return id<tmp.id;
 8             return w<tmp.w;
 9         }
10         bool operator>(const node1 tmp) const {
11             if(w==tmp.w) return id>tmp.id;
12             return w>tmp.w;
13         }
14     };
15     struct node2{//忙碌服务器堆中的点
16         LL id,w,t;
17         bool operator<(const node2 tmp) const {
18             if(t!=tmp.t) return t<tmp.t;
19             if(w!=tmp.w) return w<tmp.w;
20             return id<tmp.id;
21         }
22         bool operator>(const node2 tmp) const {
23             if(t!=tmp.t) return t>tmp.t;
24             if(w!=tmp.w) return w>tmp.w;
25             return id>tmp.id;
26         }
27     };
28     priority_queue<node1,vector<node1>,greater<node1>> free;
29     priority_queue<node2,vector<node2>,greater<node2>> busy;
30     vector<int> ans;
31     vector<int> assignTasks(vector<int>& se, vector<int>& ta) {
32         for(int i=0;i<se.size();i++) free.push({i,se[i],0});
33         for(int i=0;i<ta.size();i++){
34             while(busy.size()&&busy.top().t<=i){
35                 auto tmp=busy.top();
36                 busy.pop();
37                 free.push({tmp.id , tmp.w , tmp.t});
38             }
39             if(free.size()){
40                 auto tmp=free.top();
41                 free.pop();
42                 ans.push_back(tmp.id);
43                 busy.push({tmp.id , tmp.w , i+ta[i]});
44             }else{
45                 auto tmp=busy.top();
46                 busy.pop();
47                 ans.push_back(tmp.id);
48                 busy.push({tmp.id , tmp.w , tmp.t+ta[i]});
49             }
50         }
51         return ans;
52     }
53 };

D:https://leetcode-cn.com/problems/minimum-skips-to-arrive-at-meeting-on-time/

模型类似于上一次周赛,必须在整点上车。

可以将等待时间归到前一段,即f[i][j]表示经过i段路,操作次数为j的最小花费时间。

存在精度问题(因为需要对double上取整)。

 1 const int N=1010,INF=1e9;
 2 const double eps=1e-8;
 3 double f[N][N];
 4 class Solution {
 5 public:
 6     int minSkips(vector<int>& dist, int speed, int hoursBefore) {
 7         int n=dist.size();
 8         for(int i=1;i<=n;i++){
 9             double t=(double)dist[i-1]/speed;
10             for(int j=0;j<=i;j++){
11                 f[i][j]=INF;
12                 if(j<=i-1) f[i][j]=min(f[i][j],ceil(f[i-1][j]+t -eps ));
13                 if(j-1>=0) f[i][j]=min(f[i][j],f[i-1][j-1]+t);//j-1<=i-1必然成立
14             }
15         }
16         for(int i=0;i<=n;i++){
17             if(f[n][i]<=hoursBefore){
18                 return i;
19             }
20         }
21         return -1;
22     }
23 };
原文地址:https://www.cnblogs.com/greenofyu/p/14842633.html