Codeforces Round 857 (Div. 2)
链接
我是废物,只会做第一个题,第二个题都是看别人的题解补的
A题
这个题目比较难以理解,但是题比较好做,就是正数代表点赞,负数代表点赞减一.因为要输出在每秒内的最大点赞和最小点赞次数,所以可以发现最大就是先一只加到最大然后减小,最小就是加一减一加一减一这种,知道没有点赞减一的可能然后一直加1
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
const int N = 2000;
void solve() {
int st[3] = {0};
int a[N] = {0};
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (a[i] > 0) {
st[1]++;
} else {
st[0]++;
}
}//统计大于0和小于0的情况
int x = st[1];
int y = st[0];//先用x,y储存起来
int cnt = 0;
//先打印最大点赞数
while (st[1] > 0) {//先一直点赞
cnt++;
cout << cnt << ' ';
st[1]--;
}
while (st[0] > 0) {//然后一直让赞少一
cnt--;
cout << cnt << ' ';
st[0]--;
}
cout << '\n';
cnt = 0;
st[0] = y;
st[1] = x;
//打印点赞最小的
while (1) {
if (st[1] > 0) {//如果大于0的话就加1
cnt++;
cout << cnt << ' ';
st[1]--;
}
if (st[0] > 0) {//如果大于0的话就减一
cnt--;
cout << cnt << ' ';
st[0]--;
}
if (st[0] == 0 && st[1] == 0) {//同时为0的时候退出
cout << '\n';
break;
}
}
}
signed main () {
int t;
cin >> t;
while (t) {
solve();
t--;
}
return 0;
}
B. Settlement of Guinea Pigs
链接
这个题好像说不太清楚看代码注释吧
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
const int N = 100008;
int a[N];
void solve() {
int n;
int cnt = 0; //现在已经使用了多少个笼子
int box = 0; //最多需要多少个个笼子
int now = 0; //现在有几只猪
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%lld", &a[i]);//读入数据
if (a[i] == 1) {//如果a[i]为1的话现在我们根本不知道猪的性别所以都必须装到单独一个笼子里面
now++;//目前的猪加1
cnt++;//现在已经使用的笼子加1
if (cnt > box) {//如果需要的笼子大于了原本的笼子的数量让笼子数量加1
box++;
}
} else {
//如果这一天医生来了,计算了猪的性别
cnt = (now / 2) + 1;//会让现在已经使用的笼子减少
//这里使用的笼子数量为什么是(now/2)+1????
//如果box大于了cnt会在上面的循环里面继续使用
}
}
cout << box << '\n';//打印最后的结果
}
signed main () {
int t;
cin >> t;
while (t) {
solve();
t--;
}
return 0;
}
/*
1
3
2 2 2
*/