RC-u1 不要浪费金币 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)
RC-u2 智能服药助手 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)
RC-u3 跑团机器人 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)
RC-u4 攻略分队 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)
RC-u5 树与二分图 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)
第一题:模拟
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3 + 10;
int n, m;
int p[N];
void solve()
{
cin >> n >> m;
int cnt = 0, sum = 0;
for(int i = 1; i <= n; i ++) cin >> p[i];
for(int i = 1; i <= n; i ++){
if(sum + p[i] > m){
sum = p[i];
cnt ++;
}
else sum += p[i];
}
cout << cnt;
}
signed main()
{
int _ = 1; //cin >> _;
while(_ --){
solve();
}
}
第二题:记录前面一个同种药物的吃药时间,与当前吃药时间比较看是否超出服药间隔
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e3 + 10;
int n, m;
int pre[N];
int gap[N];
void solve()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> gap[i], pre[i] = -1;
while(m --){
int t, k; cin >> t >> k;
while(k --){
int medi; cin >> medi;
if(gap[medi] == -1) continue;
if(pre[medi] == -1) pre[medi] = t;
else {
if(t - pre[medi] < gap[medi]){
printf("Don't take %d at %d!\n", medi, t);
continue;
}
else pre[medi] = t;
}
}
}
}
signed main()
{
int _ = 1; //cin >> _;
while(_ --){
solve();
}
}
第三题:字符串处理出来作比较 有d的就是骰子(如果是加最大值和最小值同时加减,如果是减,最大值减去最少的丢失情况 最小值减去最大的丢失情况) 没有的就直接加减(最大值和最小值同时加减)
#include<bits/stdc++.h>
#define int long long
using namespace std;
map<int, int> mp;
void solve()
{
string str; cin >> str;
str = "+" + str + "+";
int l = 0, r = 0;
// cout << str << endl;
int n = str.size();
for(int i = 0; str[i] ; i ++){
if(str[i] == '+' && i + 1 < n){
int x = 0, y = 0, z = 0;
int j = i + 1;
bool f = 0;
while((str[j] != '+' && str[j] != '-') && j < n){
if(str[j] == 'd') {
f = 1;
j ++;
continue;
}
if(f == 0) x = x * 10 + str[j] - '0';
else y = y * 10 + str[j] - '0';
j ++;
}
if(f == 0) l += x, r += x;
else
{
if(y == 0) y = 1;
if(x == 0) x = 1;
mp[y] += x;
l += 1 * x, r += y * x;
}
i = j - 1;
}
else if(str[i] == '-' && i + 1 < n){
int x = 0, y = 0, z = 0;
int j = i + 1;
bool f = 0;
while(str[j] != '+' && str[j] != '-' && j< n){
if(str[j] == 'd') {
j ++;
f = 1;
continue;
}
if(f == 0) x = x * 10 + str[j] - '0';
else y = y * 10 + str[j] - '0';
j ++;
}
if(f == 0) l -= x, r -= x;
else
{
if(y == 0) y = 1;
if(x == 0) x = 1;
mp[y] += x;
l -= y * x, r -= 1 * x;
}
i = j - 1;
}
}
for(int i = 1; i <= 1000; i ++)
{
if(mp[i]) cout << i << " " << mp[i] << endl;
}
cout << l << " " << r << endl;
}
signed main()
{
int _ = 1; //cin >> _;
while(_ --){
solve();
}
}
第四题:dfs枚举所有可能的情况,最后做判断看是否可以用(代码是从佬那里抄的)
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int num[N];
bool A[N], B[N], C[N];
int totalA;//坦克总数
vector<int> ans1, ans2;
bool R0, R1, R2;
vector<int> tmp1, tmp2;//当前要判断的方案
void judge()
{
if(tmp1.empty() || tmp2.empty()) return;//空的不要
bool r0, r1, r2, t1, t2;
t1 = t2 = false;
for(int i : tmp1)
{
if(A[i]) {
t1 = true;
break;
}
}
for(int i : tmp2)
{
if(A[i]) {
t2 = true;
break;
}
}
r0 = t1 & t2;//两组是不是都有坦克
if(!r0) return;//不是 不要
t1 = t2 = false;
for(int i : tmp1){
if(C[i]){
t1 = true;
break;
}
}
for(int i : tmp2){
if(C[i]){
t2 = true;
break;
}
}
r2 = t1 & t2;//两组都有指挥
t1 = t2 = false;
for(int i : tmp1){
if(B[i]){
t1 = true;
break;
}
}
for(int i : tmp2){
if(B[i]){
t2 = true;
break;
}
}
r1 = r2 && t1 && t2;//两组都有指挥 工兵
if(!R0){ //没填过答案给一个答案
ans1 = tmp1; ans2 = tmp2;
R0 = r0, R1 = r1, R2 = r2;
return;
}
if(R1 && !r1) return;//ans里面有满足有指挥和工兵的 当前这个tmp里面不满足都有指挥和工兵的条件 不要
if(r1 && !R1){ //ans里面没有指挥和工兵都满足 但是tmp里面满足了 换
ans1 = tmp1; ans2 = tmp2;
R0 = r0, R1 = r1, R2 = r2;
return;
}
if(!R1 && !r1){ // ans里面没有满足都有指挥和工兵都满足 tmp里面也没有
if(R2 && !r2) return;// 但是ans有指挥 tmp没有指挥 不换
if(!R2 && r2){ // ans没有指挥 tmp有指挥 换
ans1 = tmp1; ans2 = tmp2;
R0 = r0, R1 = r1, R2 = r2;
return;
}
}
//规则3
int an1 = 0, an2 = 0, tn1 = 0, tn2 = 0;
for(int i : ans1) an1 += num[i];
for(int i : ans2) an2 += num[i];
for(int i : tmp1) tn1 += num[i];
for(int i : tmp2) tn2 += num[i];
int d1 = abs(an1 - an2), d2 = abs(tn1 - tn2);
if(d1 < d2) return;//ans的人数更平均 不换
if(d1 > d2){ // tmp人数更平均 换
ans1 = tmp1; ans2 = tmp2;
R0 = r0, R1 = r1, R2 = r2;
return;
}
t1 = (an1 > an2), t2 = (tn1 > tn2);//欧文大于亚特
if(t1 && !t2) return;// tmp的欧文不大于亚特 不换
if(t2 && !t1){ // 欧文的大于亚特 换
ans1 = tmp1; ans2 = tmp2;
R0 = r0, R1 = r1, R2 = r2;
return;
}
for(int k = 0; k < ans1.size() && k < ans2.size(); k ++){
if(ans1[k] < tmp1[k]) return;
else if(ans1[k] > tmp1[k]){//讨伐欧文的编号最小的
ans1 = tmp1; ans2 = tmp2;
R0 = r0, R1 = r1, R2 = r2;
return;
}
}
}
void dfs(int i)
{
if(i > 6)
{
judge();
return;
}
if(num[i] == 0){
dfs(i + 1);//不选 没有组要
return;
}
tmp1.push_back(i);//第一组要
dfs(i + 1);
tmp1.pop_back();
tmp2.push_back(i);
dfs(i + 1);//第二组要
tmp2.pop_back();
}
signed main()
{
for(int i = 1; i <= 6; i ++) cin >> num[i];
string ABC;
for(int i = 1; i <= 6; i ++){
cin >> ABC;
if(ABC[0] == '1') A[i] = true, totalA ++;
if(ABC[1] == '1') B[i] = true;
if(ABC[2] == '1') C[i] = true;
}
if(totalA < 2){
cout << "GG";
return 0;
}
else{
dfs(1);
for(int i = 0; i < ans1.size(); i ++){
if(i != 0) cout << " ";
cout << ans1[i];
}
cout << endl;
for(int i = 0; i < ans2.size(); i ++){
if(i != 0) cout << " ";
cout << ans2[i];
}
cout << endl;
}
return 0;
}
第五题:将奇数深度看作红色 偶数深度看作蓝色 答案是当前深度的颜色(比方说红色)*(前面所有不同颜颜色(蓝色)- 1)的和
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6;
int deep[N];//奇数是红色 偶数是蓝色
vector<int> g[N];
int red = 0, blue = 0;
int n;
bool st[N];
void dfs(int u, int i)
{
deep[i] ++;
st[u] = 1;
//cout << u << "深度是" << i << endl;
//cout << g[u].size() << endl;
for(int j = 0; j < g[u].size(); j ++)
{
if(st[g[u][j]]) continue;
dfs(g[u][j], i + 1);
}
}
signed main()
{
cin >> n;
for(int i = 1; i < n; i ++){
int a, b; cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
// for(int i = 1; i <= n; i ++)
// {
// cout << i << "是父亲" << '\n';
//
// for(int j = 0; j < g[i].size(); j ++)
// cout << g[i][j] << " ";
// cout << endl;
// }
dfs(1, 1);
//for(int i = 1; i <= n; i ++) cout << deep[i] << endl;
int res = 0;
for(int i = 1; i <= n; i ++)
{
if(deep[i] == 0) break;//下面没有根了 滚吧
if(i == 1)
{
red += deep[i];
continue;
}
int t = deep[i];
// cout << i << " " << red << " " << blue << endl;
if(i % 2)//红色连上面没有关系的蓝色
{
if(blue!=0)
res += t * (blue - 1);
red += t;
}
else//蓝色连上面没有关系的红色
{
if(red!=0)
res += t * (red - 1);
blue += t;
}
}
cout << res;
return 0;
}