0
点赞
收藏
分享

微信扫一扫

牛客寒假6

西曲风 2022-02-21 阅读 54

 1、进制模拟

#include <bits/stdc++.h>

using i64 = long long;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int k;
    std::cin >> k;
    
    std::string s, t;
    std::cin >> s >> t;
    
    std::reverse(s.begin(), s.end());
    std::reverse(t.begin(), t.end());
    
    int n = std::max(s.length(), t.length());
    
    std::vector<int> a(n);
    for (int i = 0; i < int(s.length()); i++) {
        a[i] += s[i] - '0';
    }
    for (int i = 0; i < int(t.length()); i++) {
        a[i] += t[i] - '0';
    }
    
    for (int i = 0; i < n; i++) {
        if (a[i] >= k) {
            if (i == n - 1) {
                a.push_back(0);
                n++;
            }
            a[i + 1]++;
            a[i] -= k;
        }
    }
    
    for (int i = n - 1; i >= 0; i--) {
        std::cout << a[i];
    }
    std::cout << "\n";
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
//C = A + B
int k;
vector<int> add(vector<int> &A, vector<int> &B)
{
  vector<int>C;
  int t = 0;//进位
  for(int i = 0; i < A.size() || i < B.size(); i++)
  {
      if(i < A.size()) t += A[i];
      if(i < B.size()) t += B[i];
      C.push_back(t % k);
      t /= k;
  }   
  if(t) C.push_back(1);
  return C;
}
int main()
{
    string a, b;
    scanf("%d",&k);
    vector<int> A, B;
    cin >> a >> b;//a = "123456"
    for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');//A =[6,5,4,3,2,1];
    for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
    auto C = add(A, B);
    //vector<int>C = add(A,B);
    for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
    system("pause");
    return 0;
}
int k, la, lb;
char a[200005], b[200005], c[200005];
int main() {
    cin >> k >> a >> b;
    reverse(a, a + strlen(a));
    reverse(b, b + strlen(b));
    for (int i = 0; a[i] || b[i] || c[i]; i++) {
        if (a[i]) c[i] += a[i] - '0';
        if (b[i]) c[i] += b[i] - '0';
        if (c[i] >= k) c[i] -= k, c[i + 1] += 1;
        c[i] += '0';
    }
    reverse(c, c + strlen(c));
    cout << c << endl;
    return 0;
}

2、+-串模拟 or 规律

 E、骑士

维护第二大的值max2的时候 首先如果max1被更改,max2一定会改;
然后如果a【i】> mx2 也可以更改mx2 
即mx2的更改有两条途径 
if(a[i]>=mx1){
                mx2=mx1;
                mx1=a[i];id1=i;
            }
            else if(a[i]>=mx2){
                mx2=a[i];
            }

 前缀后缀max

  • 下面这个程序for循环再多只要是并列就是On,下面这个程序是On的
  • 前缀后缀用空间换时间O1查询
pre控制i左边的max1,suf控制i右边的max2
void work() {
    scan(n);
    for(int i = 1; i <= n; ++i) scan(a[i]), scan(b[i]), scan(h[i]);
    pre[0] = 0; for(int i = 1; i <= n; ++i) pre[i] = max(pre[i - 1], a[i]);
    suf[n + 1] = 0; for(int i = n; i >= 1; --i) suf[i] = max(suf[i + 1], a[i]);
    ll ans = 0;
    for(int i = 1; i <= n; ++i) {
        int mx = max(pre[i - 1], suf[i + 1]);   //除了i之外的最大项    
        if(mx >= b[i] + h[i]) ans += mx - b[i] - h[i] + 1;
    }
    print(ans, '\n');
}

D、删除子序列

int n, m;
char s[M + 5], t[M + 5];
int cnt[30];
 
void work() {
    scan(n), scan(m);
    scanf("%s", s + 1), scanf("%s", t + 1);
    memset(cnt, 0, sizeof cnt);
    cnt[0] = inf;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= m; ++j) {
            if(s[i] == t[j]) {
                if(cnt[j - 1]) {
                    --cnt[j - 1];
                    ++cnt[j];
                }
            }
        }
    }
    print(cnt[m], '\n');
}

B,价值序列
 

举报

相关推荐

0 条评论