小白月赛88
A 超级闪光牛可乐
需要投喂超过 x
可以随便用
for (int i = 0;i < 1000;i++){
cout << ch;
}
B 人列计算机
判断简单的与或非门并计算结果
void solve() {
char ch;
string s = "";
while (cin >> ch) {
if (ch == '0' || ch == '1' || ch == '&') {
s += ch;
}
}
int x = 0;
if (s.size() == 2)
x = (s[0] - '0') ^ 1;
else {
if (s[1] == '1') {
x = (s[0] - '0') | (s[2] - '0');
} else {
x = (s[0] - '0') & (s[2] - '0');
}
}
cout << x << '\n';
}
C 时间管理大师
要在事件开始前 1,3,5 分钟定闹钟,求总共要定多少个闹钟
void solve() {
int n;cin >> n;
vector<pair<int, int>> a(n + 1);
set<pair<int, int>> s;
for (int i = 1;i <= n;i++) {
cin >> a[i].first >> a[i].second;
if (a[i].second >= 1)
s.insert({a[i].first,a[i].second - 1});
else
s.insert({a[i].first - 1,59});
if (a[i].second >= 3)
s.insert({a[i].first,a[i].second - 3});
else
s.insert({a[i].first - 1,60 + a[i].second - 3});
if (a[i].second >= 5)
s.insert({a[i].first,a[i].second - 5});
else
s.insert({a[i].first - 1,60 + a[i].second - 5});
}
cout << s.size() << '\n';
for (auto [x, y] : s)cout << x << " " << y << '\n';
}
D 我不是大富翁
判断走 m 次,有没有路径最终回到 1 号
坑点:p[(j - x + n) % n]
下标将会变成负数。
void solve() {
int n, m;cin >> n >> m;
vector<int> dp(n);
dp[0] = 1;
for (int i = 0;i < m;i++) {
int x;cin >> x;x %= n;
vector<int> p(n);
for (int j = 0;j < n;j++) {
if (dp[j]) {
p[(j + x) % n] = 1;
p[(j - x + n) % n] = 1;
}
}
dp = p;
}
cout << (dp[0] ? "YES\n" : "NO\n");
}
E 多重映射
给出一个数组
Solution
映射/并查集/map
for (int i = 0; i <= 1e6; i++) to[i] = i;
void solve() {
int n, m;
cin >> n >> m;
//输入
for (int i = 0; i < n; i++) cin >> a[i];
//储存操作
for (int i = 0; i < m; i++)
cin >> u[i] >> v[i];
//逆向存储
for (int i = m - 1; i >= 0; i--)
to[u[i]] = to[v[i]];
//正向对映
for (int i = 0; i < n; i++)
cout << to[a[i]] << " \n"[i == n - 1];
//处理to[]防止影响到下一组数据
for (int i = m - 1; i >= 0; i--) {
to[u[i]] = u[i];
to[v[i]] = v[i];
}
}
void solve()
{
int n, m;
cin >> n >> m;
//创建数组
vector<int> a(n), u(m), v(m);
//相当于写法1中的to[]
map<int, int> mp;
for(int i = 0; i < n; i ++) cin >> a[i];
for(int i = 0; i < m; i ++)
cin >> u[i] >> v[i];
for(int i = m - 1; i >= 0; i --)
{
//如果mp中的元素中有v[i]
//映射串联起来
if(mp.count(v[i])) mp[u[i]] = mp[v[i]];
//否则,直接赋值
else mp[u[i]] = v[i];
}
//如果mp[]中没有对映的映射,则为它本身
// 否则输出对映的映射
for(int i = 0; i < n; i ++)
cout << (mp[a[i]] ? mp[a[i]] : a[i]) << " \n"[i == n - 1];
}
F 现在是消消乐时间
给出一个
Solution
数论/找规律/搜索/构造
#include<cstdio>
#include<numeric>
int n,m,d,k;
int main(){
scanf("%d%d%d",&n,&m,&d);
k=std::gcd(n,m);
if(d==n||k==1)printf("YES\n0 0\nUR");
else if(k==2)printf("YES\n0 1\nUL");
else puts("NO");
}
G 三点不共线
给出 2 个点的坐标和要求构造的角度
Solution
构造
牛客小白月赛88 出题人题解
(待更