牛客小白月赛49
A-法
给定两个三位三进制数,请计算出它们不进位加法和。
题意
两个三位数,每一位的两个数相加,对3取余
- 两个三位数,每一位的两个数相加,对3取余。
完整代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
cin >>s1>>s2;
int a[3];
for(int i=2;i>=0;i--){
int x=(s1[i]-'0')+(s2[i]-'0');
x%=3;
a[i]=x;
}
for(int i=0;i<=2;i++){
cout <<a[i];
}
return 0;
}
B-佛
题意:
有n件礼物,每个礼物有m个颜色。
然后输入m大小的序列,代表我手里这一件礼物的m种颜色。
但是要求m种颜色,每次给你一种颜色都会问你这n件礼物中有几件符合要求,比如已经告诉你两个颜色b1,b2,你要找出同时满足这两个颜色的礼物的数量
我们暴力(手动doge)
数据大小为200*200*200+200
有点大,我一开始暴力没用快读,然后TLE了。
思路:
先将满足第一个数字的礼物标记出来,然后下一次判断已经标记的礼物是否符合下一个颜色,如果符合,
ans++
,否则,将这个礼物标记取消,将不进入下一个判断。
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,m;
cin >>n>>m;
map<int,int> ma[205];
for(int i=1;i<=n;i++){
ma[i].clear();
}
bool vis[205];
for(int i=1;i<=n;i++){
vis[i]=false;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int x;
cin >>x;
ma[i][x]++;
}
}
int ans=0;
int x;
cin >>x;
for(int j=1;j<=n;j++){
if(ma[j][x]!=0){
ans++;
vis[j]=true;
}
}
cout <<ans;
for(int i=2;i<=m;i++){
cin >>x;
for(int j=1;j<=n;j++){
if(vis[j]&&ma[j][x]==0){
vis[j]=false;
ans--;
}
}
cout <<" "<<ans;
}
cout <<endl;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >>T;
while(T--){
solve();
}
return 0;
}
C、圣
题意:
下面给了一段伪代码,将伪代码写出来跑,发现:
n个数字组成的数组代入伪代码的结果,与每两个数字组成一对代入公式计算,再将结果放回数组中直到数组大小为1的结果一样。
好了暴力!
#include<bits/stdc++.h>
using namespace std;
int a[3];
int t(int x,int y){
a[1]=x,a[2]=y;
int ans = 0;
for (int i = 1; i <= 2; ++i) {
int tp = 0;
for (int j = 1; j <= 2; ++j)
tp |= (a[i] & a[j]);
ans ^= tp;
}
return ans;
}
void solve(){
map<int,int> ma;
queue<int> q;
int n;
cin >>n;
for(int i=1;i<=n;i++){
int x;
cin >>x;
q.push(x);
}
while(q.size()!=1){
int x=q.front();
q.pop();
int y=q.front();
q.pop();
q.push(t(x,y));
}
cout <<q.front()<<endl;
}
int main(){
int T;
cin >>T;
while(T--){
solve();
}
return 0;
}