C
在回转寿司店里面有n个标为 A i A_i Ai人和m个标为 B j B_j Bj寿司。
每个寿司依次从1 2 3 … n人面前经过,当 B j ≥ A i B_j \geq A_i Bj≥Ai时i人就拿走寿司。
问:每个寿司被谁吃了?
对寿司进行排序,依次从1 2 3 … n人来看每个人怎么拿。
排序之后会发现,每个人一定会把最前面的那些满足条件的寿司拿走。然后下一个人接着拿。因此可以用一个指针指向当前拿到的寿司位置。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
int n, m;
const int N = 200020;
struct Item {
int x, i;
} b[N];
int a[N];
int ans[N];
int main(){
//freopen("in.txt", "r", stdin);
cin >> n >> m;
for (int i = 1; i <= n; ++ i) {
cin >> a[i];
}
for (int i = 1; i <= m; ++ i) {
int t;
cin >> t;
b[i] = {
t, i};
}
sort(b + 1, b + m + 1, [&](Item x, Item y){
return x.x > y.x;
});
memset(ans, -1, sizeof(ans));
int j = 0;
for(int i = 1; i <= n; ++ i) {
while(j + 1 <= m && b[j + 1].x >= a[i]) {
ans[b[j + 1].i] = i;
++ j;
}
}
for (int i = 1; i <= m; ++ i) {
printf("%d\n", ans[i]);
}
return 0;
}
D
搜索数列。写的时候注意剪枝。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
vector<vi> ans;
int n, m;
int path[12];
void go(int pos, int cur) {
if (cur > m)
return;
path[pos] = cur;
if (pos == n - 1) {
vi temp(path, path + n);
ans.push_back(temp);
return;
}
int lmt = cur + (n - pos - 1) * 10;
if (lmt > m)
return;
for (int i = 10; i <= 20; ++i) {
go(pos + 1, cur + i);
}
}
int main(){
//freopen("in.txt", "r", stdin);
cin >> n >> m;
for (int a0 = 1; a0 <= min(m, 20); ++a0) {
go(0, a0);
}
printf("%d\n", ans.size());
for (auto vi : ans) {
for (int x : vi) {
printf("%d ", x);
}
printf("\n");
}
return 0;
}
E
有无数个包,每个包里面都有N张卡片,每张卡片是稀有卡的概率是 p i p_i p

最低0.47元/天 解锁文章
886

被折叠的 条评论
为什么被折叠?



