zoukankan      html  css  js  c++  java
  • leetcode周赛 255

    https://leetcode-cn.com/contest/weekly-contest-225/

    A:枚举,或者可以找规律

    解法一:枚举

     1 class Solution {
     2 public:
     3     bool check(char * a,string& b){
     4         for(int i=0;i<5;i++){
     5             if(a[i]!=b[i]&&b[i]!='?')
     6                 return false;
     7         }
     8         return true;
     9     }
    10     string maximumTime(string time) {
    11         for(int i=23;i>=0;i--){
    12             for(int j=59;j>=0;j--){
    13                 char str[20];
    14                 sprintf(str,"%02d:%02d",i,j);
    15                 if(check(str,time)){
    16                     return str; 
    17                 }
    18             }
    19         }
    20         return "";
    21     }
    22 };

    解法二:找规律

     1 class Solution {
     2 public:
     3     string maximumTime(string time) {
     4         if(time[0]=='?'&&time[1]=='?'){
     5             time[0]='2';
     6             time[1]='3';
     7         }else if(time[0]!='?'&&time[1]=='?'){
     8             if(time[0]>='0'&&time[0]<='1'){
     9                 time[1]='9';
    10             }else if(time[0]=='2'){
    11                 time[1]='3';
    12             }
    13             
    14         }else if(time[1]!='?'&&time[0]=='?'){
    15             if(time[1]>='0'&&time[1]<='3')
    16                 time[0]='2';
    17             else if(time[1]>='4'&&time[1]<='9')
    18                 time[0]='1';
    19             
    20         }
    21         
    22         if(time[3]=='?'&&time[4]=='?'){
    23             time[3]='5';
    24             time[4]='9';
    25         }
    26         if(time[3]!='?'&&time[4]=='?'){
    27             time[4]='9';
    28         }
    29         if(time[3]=='?'&&time[4]!='?'){
    30             time[3]='5';
    31         }
    32         return time;
    33     }
    34 };

    B:枚举分界线

     1 class Solution {
     2 public:
     3     int cnta[26],cntb[26];
     4     int fun(int a[],int b[]){
     5         int res=INT_MAX;
     6         for(int i=1;i<25;i++){
     7             int t=0;
     8             for(int j=i+1;j<26;j++){
     9                 t+=a[j];
    10             }
    11             for(int j=i-1;j>=0;j--){
    12                 t+=b[j];
    13             }
    14             t+=min(a[i],b[i]);
    15             res=min(res,t);
    16         } 
    17         return res;
    18     }
    19     int minCharacters(string a, string b) {
    20         for(auto x:a){
    21             cnta[x-'a']++;
    22         }
    23         for(auto x:b){
    24             cntb[x-'a']++;
    25         }
    26         int res=INT_MAX;
    27         for(int i=0;i<26;i++){//条件三
    28             int t=cnta[i]+cntb[i];
    29             res=min(res,int(a.length()+b.length()-t));
    30         }
    31         res=min(res,fun(cnta,cntb));
    32         res=min(res,fun(cntb,cnta));
    33         return res;
    34     }
    35 };

    C:模板题,容斥原理,二位前缀和

     1 class Solution {
     2 public:
     3     int kthLargestValue(vector<vector<int>>& matrix, int k) {
     4         vector<vector<int>> v;
     5         int n=matrix.size();
     6         int m=matrix[0].size();
     7         v.resize(n);
     8         for(int i=0;i<n;i++){
     9             v[i].resize(m);
    10         }
    11         vector<int> q;
    12         for(int i=0;i<n;i++){
    13             for(int j=0;j<m;j++){
    14                 v[i][j]=matrix[i][j];
    15                 if(i-1>=0)
    16                     v[i][j]^=v[i-1][j];
    17                 if(j-1>=0)
    18                     v[i][j]^=v[i][j-1];
    19                 if(i-1>=0&&j-1>=0)
    20                     v[i][j]^=v[i-1][j-1];
    21                 q.push_back(v[i][j]);
    22             }
    23         }
    24         sort(q.begin(),q.end());
    25         reverse(q.begin(),q.end());
    26         return q[k-1];
    27     }
    28 };

    D:思维题

    第一层数目是 1

    第二层数目是 1+2

    第三层数目是1+2+3

    首先找出层数 i ,满足sum<=n

    对于多出来的,却又不够下一层的,可以发现最优策略是沿着对角线排成一行

    因为如果排成一行的话,可放置的各自的数目为1+2+...+q,q为一行的数目

     1 class Solution {
     2 public:
     3     int minimumBoxes(int n) {
     4         int sum=0;
     5         int k=1,i=1;
     6         while(sum+k<=n){
     7             sum+=k;
     8             i++;
     9             k+=i;
    10         }
    11         int res=k-i;
    12         k=1;
    13         while(sum<n){
    14             res++;
    15             sum+=k;
    16             k++;
    17         }
    18         return res;
    19     }
    20 };
  • 相关阅读:
    sublime text在Linux下build出现'ascii' codec can't decode byte 0xe4 in position 0的解决办法
    sublime text的verilog插件——verilog automatic
    Ubuntu Lucid Installation Guide
    vim之perlsupport的小修改
    python笔记
    sublime text中ctags使用注意事项
    2021年终总结
    wp7学习站点
    WPF中调用Winform控件
    Xen Cloud Platform 系列:NFS 存储库(四)
  • 原文地址:https://www.cnblogs.com/greenofyu/p/14324589.html
Copyright © 2011-2022 走看看