牛客小白月赛#67
文章目录
A.画牌河
-
题意
- 输出3*6的牌河,从左到右从上到下输出牌河情况,有牌输出1,没牌输出0
-
题解
- 签到捏。这种格式输出有两种解决方法:1.先把字符矩阵依次填好,然后再输出。2.边按规律填边输出
-
代码
#include <iostream>
using namespace std;
//边找规律边输出简洁,其实就是输出的框架再加上规律
int main() {
int x; cin>>x;
int cnt=0;
for(int i=0;i<3;i++) {
for(int j=0;j<6;j++)
if(++cnt<=x) cout<<1;
else cout<<0;
puts("");
}
return 0;
}
B.不点两面(easy version)
-
题意
- m种牌,对手操作q次,拿或者放入数字牌num,num对应的安全牌为num+3/num-3
- 问每次操作后有多少种安全牌
-
题解
- 哈希计数。对于每个操作记录安全牌的数量,当安全牌数量从0变1说明种类增加。从1变0说明种类减少
-
代码
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
map<int,int> safe_cnt;
int main() {
int m,q; cin>>m>>q;
int sum=0;
while(q--) {
int op,num; cin>>op>>num;
if(op==1) {
if(num-3>=1 && ++safe_cnt[num-3]==1) sum++;
if(num+3<=m && ++safe_cnt[num+3]==1) sum++;
} else {
if(num-3>=1 && --safe_cnt[num-3]==0) sum--;
if(num+3<=m && --safe_cnt[num+3]==0) sum--;
}
cout<<sum<<'\n';
}
return 0;
}
C.开题顺序
-
题意
- 给三个特定位置的点坐标,问是否能够切割成两个面积相等的三角形
-
题解
- 数学。分段切割后用相似计算面积,暴力枚举判断切割点位即可
-
代码
#include <iostream>
using namespace std;
bool solve() {
int xb,xc,yc; cin>>xb>>xc>>yc;
for(int x0=0;x0<=xc;x0++)
if(2*x0*x0==xb*xc) return 1;
for(int x0=xc;x0<=xb;x0++)
if(2*(xb-x0)*(xb-x0)==xb*(xb-xc)) return 1;
return 0;
}
int main() {
int t; cin>>t;
while(t--) {
cout<<(solve() ? "YES":"NO")<<'\n';
}
return 0;
}
D.不点两面(hard version)
-
题意
- m种牌,对手操作q次,拿或者放入数字牌num,num对应的安全牌为num+3/num-3
- 问每次操作后有多少种安全牌
-
题解
- 哈希计数。对于每个操作记录安全牌的数量,当安全牌数量从0变1说明种类增加。从1变0说明种类减少
- 虽然版本加强了,但其实依然可以过,嗯嗯
-
代码
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
map<int,int> safe_cnt;
int main() {
int m,q; cin>>m>>q;
int sum=0;
while(q--) {
int op,num; cin>>op>>num;
if(op==1) {
if(num-3>=1 && ++safe_cnt[num-3]==1) sum++;
if(num+3<=m && ++safe_cnt[num+3]==1) sum++;
} else {
if(num-3>=1 && --safe_cnt[num-3]==0) sum--;
if(num+3<=m && --safe_cnt[num+3]==0) sum--;
}
cout<<sum<<'\n';
}
return 0;
}
219

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



