总结:好久之前做的一场比赛了,当时A了AB两题,C题是位运算(有点恶心),今天又拿出来重新做了一下。。。把C题过了,挺奇妙的。。。。
A. Likes
思路:找规律,分别计算正数和负数的数量,最大值为先算正数,再算负数,最小值为一个正数一个负数,后面都为正数
AC代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int T,n,a,b,x,cnt;
cin>>T;
while(T--){
cin>>n;
a=0;b=0;cnt=0;
for(int i=1;i<=n;i++){
cin>>x;
if(x>0){
a++;
}else{
b++;
}
}
for(int i=1;i<=n;i++){
if(i<=a){
cout<<++cnt<<' ';
}else{
cout<<--cnt<<' ';
}
}
cout<<'\n';
for(int i=1;i<=min(a,b);i++){
cout<<1<<' '<<0<<' ';
}
for(int i=1;i<=abs(a-b);i++){
cout<<i<<' ';
}
cout<<'\n';
}
return 0;
}
B. Settlement of Guinea Pigs
思路:模拟
模拟即可,计算连续出现1的个数
#include<iostream>
using namespace std;
int main(){
int T,n,a,b,op,ans,zans;
cin>>T;
while(T--){
cin>>n;
a=0;b=0;ans=0;zans=0;
for(int i=0;i<n;i++){
cin>>op;
if(op==1){
a++;
zans++;
if(ans<zans){
ans++;
}
}else{
b+=a;
a=0;
if(b%2){
zans=1+(b-1)/2;
}else{
zans=2+(b-2)/2;
}
}
}
cout<<ans<<'\n';
}
return 0;
}
C. The Very Beautiful Blanket
思路:位运算(异或的性质)
下面是i^i+1的结果,打表便可发现规律,每2的n次方个数可分为一组,每一组前面的数都是相同的,而且每一组的数也是都有规律的,因此可以考虑相同异或为0
#include<iostream>
#define int long long
using namespace std;
signed main(){
int T,n,m;
cin>>T;
while(T--){
cin>>n>>m;
cout<<n*m<<'\n';
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<(i<<9)+j<<' ';
}
cout<<'\n';
}
}
return 0;
}