1.Stone Game
可以分为三种情况,
1.从最左边开始,直到摧毁最大和最小的石头。
2.从最右边开始,直到摧毁最大和最小的石头。
3.从两端开始,直到摧毁最大和最小的石头。
取三种情况的最小值
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int a[N];
int main()
{
//mp用来存每个石头对应位置
map<int ,int >mp;
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
mp[a[i]]=i;
}
sort(a,a+n);
//i为最大或最小石头位置较小的那个
//j为最大或最小石头位置较大的那个
int i=min(mp[a[0]],mp[a[n-1]]),j=max(mp[a[0]],mp[a[n-1]]);
int ans=min({j+1,n-i,i+1+n-j});
cout<<ans<<endl;
}
return 0;
}
- Do Not Be Distracted!
把连续的字符当作一个字符放入集合当中,如果后面还会出现这个字符,说明返回上一个任务了,就可以被怀疑,输出NO,否则输出YES。
#include<set>
#include<iostream>
using namespace std;
const int N=30;
int a[N];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
string s;
cin>>s;
multiset<char>set;//multiset集合中元素可以出现多次
bool st=false;
for(int i=0;i<n;)
{
set.insert(s[i]);
if(set.count(s[i])>1)
{
cout<<"NO"<<endl;//被怀疑输出NO
st=true;
break;
}
int j=i+1;
//每个连续的当作一个字符,进入集合
while(j<n&&s[j]==s[j-1])
j++;
i=j;
}
if(!st) cout<<"YES"<<endl;
}
return 0;
}
- 高低位交换
在存二进制的高低位时按照题目要求存即可
#include<iostream>
using namespace std;
int main()
{
long long int n;
cin>>n;
int b[35];
int idx=16;//idx表示数组b的下标
//高十六位为存入b[16-31]
for(int i=31;i>15;i--)
b[idx++]=n>>i&1;
idx=0;
//低十六位为存入b[0-15]
for(int i=15;i>=0;i--)
b[idx++]=n>>i&1;
//由二进制转化成十进制
long long int ans=0;
for(int i=0;i<32;i++)
ans=ans*2+b[i];
cout<<ans<<endl;
return 0;
}
4.内码对称
先得到二进制表示,然后判断是否对称
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long int n;
cin>>n;
int b[35];
//得到n的二进制表示
for(int i=31;i>=0;i--)
b[i]=n>>i&1;
//判断是否对称
bool st=true;
for(int i=0,j=31;i<=15;i++,j--)
if(b[i]!=b[j])
{
st=false;
break;
}
if(st) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
- 寻找最低数
lowbit()的模板
#include<set>
#include<iostream>
using namespace std;
int lowbit(int x)
{
return x&-x;
}
int main()
{
int n;
while(scanf("%d",&n),n!=0)
{
int x=lowbit(n);
cout<<x<<endl;
}
return 0;
}
6.Ancient Civilization
把这些数转化为二进制数以后,统计二进制数中每一位中1和0的总数,构造的二进制数的每一位是总数多的那个,然后转化为十进制输出。
#include<bits/stdc++.h>
using namespace std;
const int N=35;
int a0[N],a1[N];//分别记录二进制下每位0和1的个数
int b[N];//记录构造的二进制数
int main()
{
int T;
cin>>T;
while(T--)
{
memset(a0,0,sizeof(a0));
memset(a1,0,sizeof(a1));
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
for(int j=m-1;j>=0;j--)
{
int res=(x>>j)&1;
if(res==1) a1[j]++;
else a0[j]++;
}
}
//构造的二进制取每位上0或1多的那个
for(int i=0;i<m;i++)
{
if(a0[i]>=a1[i]) b[i]=0;
else b[i]=1;
}
//转化为十进制
int cnt=1;
int ans=b[0];
for(int i=1;i<m;i++)
{
cnt=cnt*2;
ans+=b[i]*cnt;
}
cout<<ans<<endl;
}
return 0;
}