A welcome to AtCoder Land
题目:
思路:字符串比较
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
if(a == "AtCoder" && b == "Land") cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
B Ticket counter
题目:
思路:记录下第 i-1个人买完票的时间now,更新now 为max t[i], now后now + a 输出now
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a;
cin >> n >> a;
vector<int> t(n + 1);
int now = 0;//now表示上一个人买完票的时间
for(int i = 1; i <= n; i ++ ) cin >> t[i];
for(int i = 1; i <= n; i ++ ) {
if(i == 1) {
now = t[i] + a;
cout << t[i] + a << endl;
} else {
now = max(t[i], now);
now += a;
cout << now << endl;
}
}
return 0;
}
C popcorn
问题
思路:注意到n很小,考虑爆搜,现在思考一个问题,如何把时间尽可能的压缩。
1 字符串比较是浪费时间时间,因此可以考虑优先处理下字符串,这里的做法是状态压缩,o代表二进制的1,x代表2进制的0,两个摊位的爆米花口味是a | b。这样可以极大的节省时间
2 剪枝, 设全局最大值ans = 0, 如果在dfs过程中方案数大于ans直接return
3 排列组合优化 这里选的摊位并没有明确的顺序,因此先选a和先选b是一样的,可以在dfs中记录一个start
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> str(n + 1);
for(int i = 1; i <= n; i ++ ) {
int cnt = 0;
for(int j = 0; j < m; j ++ ) {
char ok;
cin >> ok;
if(ok == 'o') cnt += 1 << j;
}
str[i] = cnt;
}
vector<bool> st(n + 1, false);
int ans = n;
function<void(int, int, int)> dfs = [&](int u, int cnt, int res) -> void {
if(cnt >= ans) return;
if(res == ((1 << m) - 1)) ans = cnt;
for(int i = u + 1; i <= n; i ++ ) {
if(!st[i]) {
st[i] = true;
int tmp = res;
res |= str[i];
dfs(i, cnt + 1, res);
st[i] = false;
res = tmp;
}
}
};
dfs(0, 0, 0);
cout << ans;
return 0;
}
D souvneirs
题目:
思路:堆, 排序, 双指针,贪心,平衡树都可以做。把a放进小根堆里,b从小到大sort,如果满足条件b索引++,每次操作把堆顶pop掉...
这里有个小坑,在对vector排序如果没用到a[0],一定要从a.begin() + 1开始sort, 当然这里数都大于0,这个不影响
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<int> a(n + 1);
vector<int> b(m + 1);
for(int i = 1; i <= n; i ++ ) cin >> a[i];
for(int i = 1; i <= m; i ++ ) cin >> b[i];
sort(b.begin(), b.end());
priority_queue<int, vector<int>, greater<int>> q;
for(int i = 1; i <= n; i ++ ) q.push(a[i]);
long long ans = 0;
int i = 1;
while(q.size() && i <= m) {
if(q.top() >= b[i]) {
ans += q.top();
i ++;
q.pop();
} else {
q.pop();
}
}
if(i == m + 1) cout << ans;
else cout << -1;
return 0;
}
E alphabet tiles
题目:
思路:一眼数位dp