https://ac.nowcoder.com/acm/contest/25080
第一题太简单略过
第二题 贪心:注意两种情况,5元纸币够用和5元纸币不够用;
if从句搞定
#include <stdio.h>
int main(){
long long int n,a,cnt5,cnt1;
scanf("%d %d",&n,&a);
cnt5 = a / 5;
if(cnt5 > n){
cnt5 = n;
cnt1 = a-n*5;
}else{
cnt1 = a-cnt5*5;
}
printf("%d %d",cnt5,cnt1);
return 0;
}
第三题 简单博弈(课上讲过) 直接上(k+1)的倍数
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
if(n%4==0){
printf("bob");
}else{
printf("kiki");
}
return 0;
}
第四题 暴力枚举
https://ac.nowcoder.com/acm/contest/25080求余通过比较找最大值
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,r,l;
int ans=0;
cin >> n >> l >> r;
for(int i=l;i<=r;i++){
ans=max(ans,i%n);
}
cout << ans;
return 0;
}
第五题 位运算巧用(附其他做法)
注意题目是 求二的正整数次幂之和;
奇数直接输出-1,不符合要求;
剩下的数由二进制形式找到第一个“1”所在的位置,前面补零
#include <bits/stdc++.h>
using namespace std;
int main(){
int x,i;
cin >> x;
if(x%2!=0){
cout<<-1<<endl;
}else{
for(i=31;i>=1;i--){
if(x>>i&1){
cout<<(1<<i)<<" "; //输出2的i次方;
}
}
}
return 0;
}
//x&1代表最低位的值(最右位的值)
//假设:x=10==(1010)2
//那么 x&1 == 0
#include<stdio.h>
int main(void){
int n ;
int i ;
scanf("%d" , &n);
if (n % 2 == 1) printf("-1");
if(n % 2 == 0){
for(i = 2 ; n > 0 ; i = i * 2){
if(i > n){
i = i / 2;
n = n - i;
printf("%d " , i);
i = 2;
}
}
}
return 0 ;
}