好未来笔试[整理了下大佬们的答案和自己的想法]
一个数分成几份,可以被 3 整除的最大份数。比如 12345 分成12 3 45 结果为3.
思路: 从前向后扫描,贪心: 遇到符合要求的继续下去。
- m 记录前后几个数相加之和,最大不超过3 (111 222), c1 c2 记录单位被 3 除余1 余2 的情况, m>0 && m%3==0 || c1 >1 && c2 >2 归位
- 某个数可以被 3 整除 continue
作者:泫
链接:https://www.nowcoder.com/discuss/100031?type=2&order=0&pos=7&page=1
来源:牛客网
#include <bits/stdc++.h>
using namespace std;
int main() {
//freopen("../in.txt", "r", stdin);
string str;
cin >> str;
int i, len = str.length(), m, number, ans = 0, c1, c2;
for (i = 0, m = 0, c1 = 0, c2 = 0; i < len; i++) {
number = str[i] - '0';
//遇到3的情况直接加1
if (number % 3 == 0) {
ans++;
m = 0, c1 = 0, c2 = 0;
continue;
}
m += number;
if (number % 3 == 1)
c1++;
else
c2++;
//判断能不能有一个组合
if ((m > 0 && m % 3 == 0) || (c1 > 0 && c2 > 0)) {
ans++;
m = 0, c1 = 0, c2 = 0;
}
}
cout << ans << endl;
}
x + y = x|y 给定x, 求满足要求的第 k 个 y
思路: 位运算。把 k 的所有位从低到高填充到 x 对应为0的位上。
比如 x = 2 =0b10
k = 1 = 0b1 , y = 0b01
k = 2 = 0b10 , y = 0b100(加粗的1是因为要跳过x对应的1)
仔细想一下就知道为什么了。
作者:泫
链接:https://www.nowcoder.com/discuss/100031?type=2&order=0&pos=7&page=1
来源:牛客网
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
//freopen("../in.txt", "r", stdin);
ll t,x,k,ans,i,j,a,lenX,lenK,lenA;
int posX[160],posK[160],posA[160];
cin>>t;
while (t--){
memset(posX,0, sizeof(posX));
cin>>x>>k;
i=0,ans=0;
while (x>0){
posX[i++]=x&1;
x=x>>1;
}
lenX=i;
i=0;
while (k>0){
posK[i++]=k&1;
k=k>>1;
}
lenK=i;
for(i=0,j=0,a=0;j<lenK;i++){
if(posX[i]==0)
posA[a++]=posK[j++];
else
posA[a++]=0;
}
lenA=a;
for(i=lenA-1;i>=0;i--){
ans=ans<<1;
ans=ans|posA[i];
}
cout<<ans<<endl;
}
}
自己的代码(丑)
# coding=utf-8
import sys
if __name__ == "__main__":
n = sys.stdin.readline().strip()
for i in range(int(n)):
x, k = list(map(int, sys.stdin.readline().strip().split()))
x_bin = bin(x)[2:]
x_bin_len = len(x_bin)
x_bin_reverse = [i for i in x_bin][::-1]
k_bin = bin(k)[2:]
res = []
x_index = 0
for k_i in k_bin[::-1]:
while x_index <= x_bin_len-1 and x_bin_reverse[x_index]== "1":
res.append(0)
x_index += 1
res.append(k_i)
x_index += 1
num = "".join(list(map(str, res[::-1])))
print(int(num, 2))
给定数组[1-9] 和 boll_array[01111110], 0表示可以不输出, 1必须输出对应位,输出所有可能情况(字符串升序)
这道题不是很会,暴力递归 ac 了50多的用例。后来想了想感觉可以求多个数组的笛卡尔集。
下面是别人的ac代码。
作者:whlprogram
链接:https://www.nowcoder.com/discuss/100047?type=2&order=0&pos=7&page=1
来源:牛客网
#include<cstdio>
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<string> arr;
int main()
{
int a[11];
for(int i=0; i<10; i++)
scanf("%d",&a[i]);
for(int i=0; i<(1<<10); i++)
{
int f=0;
for(int j=0; j<10; j++)
if(!((i&(1<<j)))&&a[j])
{
f=1;
break;
}
if(f)
continue;
string str="";
for(int j=0; j<10; j++)
if(i&(1<<j))
str.push_back('0' + j);
arr.push_back(str);
}
sort(arr.begin(),arr.end());
for(int i=0; i<arr.size(); i++)
cout<<arr[i]<<endl;
return 0;
}
作者:泫
链接:https://www.nowcoder.com/discuss/100031?type=2&order=0&pos=7&page=1
来源:牛客网
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int a[10]={0,1,2,3,4,5,6,7,8,9};
int pos[10],i,p[10];
set<string> v;
void Print(){
string s="";
for(i=0;i<10;i++){
if(p[i]==1)
s+=a[i]+'0';
// cout<<a[i];
}
v.insert(s);
// cout<<s<<endl;
}
int main() {
// freopen("../in.txt", "r", stdin);
for(i=0;i<10;i++)
cin>>pos[i];
int add = 0,tmp;
while (1){
int flag=0;
for(i=9;i>=0;i--){
if(p[i]==0){
flag=1;
}
}
if(flag==0){
break;
}
//打印
tmp=add++;
for(i=9;i>=0;i--){
p[i]=pos[i];
if(pos[i]==0){
p[i]=tmp&1;
tmp=tmp/2;
}
}
Print();
}
set<string>::iterator it;
for(it=v.begin();it!=v.end();it++){
cout<<*it<<endl;
}
}
求期望。
n 面筛子,m面有奖,有奖继续掷筛子,没奖结束。
输入给定 score 数组 s_array, len(s_array) == n, 求期望。
数学题, e =
- ave_score = sum(s_array)/n
- (n-m)/n * avg_score (第一次就没奖)+
- m/n * (score + e) (第一次有奖,相当于从头开始)
化简得到 e = sum(s_array)/n-m
最大上升子序列和, 动态规划
题目和思路见 https://blog.csdn.net/sjf0115/article/details/8715586, 贴下大佬的代码
作者:whlprogram
链接:https://www.nowcoder.com/discuss/100047?type=2&order=0&pos=7&page=1
来源:牛客网
#include<stdio.h>
using namespace std;
int arr[100];
int maxSumIS( int arr[], int n )
{
int i, j, max = 0;
int dp[n];
for ( i = 0; i < n; i++ )
dp[i] = arr[i];
for ( i = 1; i < n; i++ )
for ( j = 0; j < i; j++ )
if ( arr[i] > arr[j] && dp[i] < dp[j] + arr[i])
dp[i] = dp[j] + arr[i];
for ( i = 0; i < n; i++ )
if ( max < dp[i] )
max = dp[i];
return max;
}
int main()
{
int temp=0, i=0;
while(~scanf("%d", &temp)){
arr[i] = temp;
i++;
}
printf("%d\n", maxSumIS(arr, 100));
return 0;
}#好未来##笔试题目##题解#
