来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
A 题目描述
牛牛很喜欢吃米饭,他的一顿饭是有 s 个米粒组成。一个偶然的机会,他找到了一条直线,这条直线上有 n 个格子,第一个格子有1个米粒,第二个格子有2个米粒,第三个格子有4个米粒……依次类推,第 n 个格子有 2n-1 个米粒。但由于有 k 个格子存在问题,会导致放在这些格子上的米粒全部丢失。现在想从剩下的 n-k 个格子中选出某些格子,拿走选中的格子上的全部米粒,问是否有恰好选出s个米粒的方案?
输入描述
输出描述
能组成一个数量为 s 的米粒堆输出 YES,否则输出 NO.
AC
/*
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e+5;
int main(){
int n, k, s;
cin >> n >> k >> s;
int i,flag=0;
int str[maxn];
memset(str, 0, sizeof(str));
for (i = 1; i <= n;i++)
str[i] = int(pow(2.0, float(i - 1)));
int rem,t = 0,sum = 0;
rem = n - k;
for (i = 1; i <= n; i++)
{
sum += str[i];
t++;
if(sum==s){
break;
flag = 1;
}
}
//误区在于不能在 1-n 中随机几个值组成和
if(t<=rem&&flag==1)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n, k, s;
cin >> n >> k >> s;
while(k--){
ll a;
cin >> a;
if(s>>(a-1)&1)
return puts("NO"), 0;
}
puts("YES");
return 0;
}
位逻辑运算
& 运算 ———————– -2个都为1-》1
0&1 =0;
0&0 =0;
1&0 =0;
1&1 =1;
00111
& =00100
11100
&运算通常用于二进制取位操作,例如一个数 &1的结果就是取二进制的最末位。
这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数是偶数,最末位为1表示该数为奇数
运算
和<<相似,a>>b表示二进制右移b位(去掉末b位),相当于a除以2的b次方(取整)。我们经常用>>1来代替 /2(div 2),比如二分查找、堆的插入操作等等。想办法用>>代替除法运算可以使程序的效率大大提高。最大公约数的二进制算法用除以2操作来代替慢的出奇的%(mod)运算,效率可以提高60%。
int a =100;
a/4 ==a>>2;
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
B 题目描述
牛牛吃饱之后觉的非常口渴,于是他找出了他最喜欢的cocacola!
牛牛的强迫症很强,虽然都是cocacola,但如果其中的某些字母的顺序颠倒或位置互换,他就不想去喝它。
为了尽快喝到cocacola,他把这个问题交给了你,希望你能告诉他最少需要交换多少次字符位置(每次仅可交换一个字母)可以得到cocacola
输入描述
一行长度为8的字符串且保证有解
输出描述
一个数字,表示得到 cocacola 的最少交换次数
AC
/*
#include <bits/stdc++.h>
using namespace std;
int main(){
char ch[8] = {'c', 'o', 'c', 'a', 'c', 'o', 'l', 'a'};
char str[8];
cin >> str;
int i,t=0;
for (i = 0; i < 8;i++){
if(str[i]!=ch[i]){
t++;
continue;
}
}
cout << t / 2 << endl;
return 0;
}
*/
#include <bits/stdc++.h>
using namespace std;
string s, t = "cocacola";
int cnt;
int main(){
int c = 0, p = 0;
cin >> s;
for (int i = 0; i < 8;i++)
if(s[i]=='l')
p = i;
if(p!=6){
swap(s[6], s[p]);
cnt++;
}
for (int i = 0; i <8;i++){
if(s[i]!=t[i])
c++;
}
cout << cnt + (c + 1) / 2 << endl;
return 0;
}