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的字符无非等和不等:
- a[i]=b[i] 表示都打出来了
- 否则,视 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;
}