b_pat_魔术优惠卷 & 坏掉的键盘(排序+双指针)

Magic Coupon

每个优惠券上都印有一个整数 N,当你将此优惠券用于产品时,商店会给你 N 倍于该商品价值的钱。
现在,给定你若干的优惠券和若干的商品,每个优惠券和商品最多只能选择一次,请问你最多可以从商店里拿回多少钱。

方法一:排序+双指针

思路
对两个数组排序:

  • 对于负数和负数直接相乘即可(因为两个较小的负数相乘的结果最大);
  • 而对于负数和正数这种组合,则需要将负数过滤掉;然后确保后面的数对都是正数,最后从后往前累加正数对的乘积(贪心)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;

int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll n,m,C[N], P[N];
    cin>>n; for (int i=0; i<n; i++) cin>>C[i];
    cin>>m; for (int i=0; i<m; i++) cin>>P[i];
    
    sort(C, C+n), sort(P, P+m);
    ll ans=0, i=0, j=0;
    while (i<n && j<m && C[i]<0 && P[j]<0) ans+=C[i++]*P[j++];
    while (i<n && C[i]<=0) i++;
    while (j<m && P[j]<=0) j++;
    
    int ii=n-1, jj=m-1;
    while (ii>=i && jj>=j) ans+=C[ii--]*P[jj--];
    cout<<ans;
    return 0;
}

Broken Keyboard

当你输入一些句子时,与坏掉的按键相对应的字符将不会出现在屏幕上。
现在给定你应该键入的字符串以及你实际键入的字符串,请找出哪些按键坏了。

思路
首先,要找的字符一定在a中,a和b的字符无非等和不等:

  1. a[i]=b[i] 表示都打出来了
  2. 否则,视 a[i] 为坏掉的键,输出即可(注不能输出多次同一个字符)
#include<bits/stdc++.h>
using namespace std;
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    string a,b; cin>>a>>b;
    int n=a.size(), m=b.size(), i=0, j=0, st[200]; memset(st, false, sizeof st);

    while (i<n) {   //m≤n
        char u=toupper(a[i]), v=toupper(b[j]);
        if (u==v) { //相同代表都打出来了
            j++;
        } else if (!st[u]) {
            st[u]=1, cout<<u;
        }
        i++;
    }
    return 0;
}
posted @ 2020-09-23 09:34  童年の波鞋  阅读(91)  评论(0编辑  收藏  举报