牛客练习赛89

来源:牛客网

时间限制: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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值