字节跳动2019春招第一批笔试

#第一题

题目大意

有1024元钱 输入你花掉的数目问找回的硬币数最小

有64 16 4 1 的硬币

水题 代码没存 Pycharm可以恢复真是太强了

整数除硬币面额 再求和

n=input()
n=int(n)
n=1024-n
ans=0
ans+=n//64
n-=64*(n//64)
ans+=n//16
n-=16*(n//16)
ans+=n//4
ans+=(n-4*(n//4))
print(ans)

#第二题

题目大意

在字符串中有连续的三个字母要去掉一个

有连续的AABB型的  要去掉第二对中的一个字母 即AAB

匹配顺序是从左到右例如AABBCC 结果为AABCC

保存在电脑上的代码好像是AC的那一版

n=input()
n=int(n)
for _ in range(0,n):
    line=input()
    line=list(line)
    i=0
    while i<len(line)-2:
        if(i<len(line)-2):
            if(line[i]==line[i+1]==line[i+2]):
                del(line[i+2])
                i-=1
        if(i<len(line)-3):
            if(line[i]==line[i+1] and line[i+2]==line[i+3]):
                del(line[i+3])
                i-=1
        i+=1
    print(''.join(line))

#第三题

题目大意

有n个人 围成一圈每个人都有自己的分数

规定

1.当前人的分数如果大于左右人的分数

那么也要比左右人获得更多的礼物

2.每人至少有一个礼物

求礼物数最小

有一组样例

2

5

1 2 3 4 5

5

5 4 3 2 1

结果都是15

错误解法:(待填坑)  已填

#include <iostream>
#include <cstdio>
#include <math.h>
#include<algorithm>
#include<cstring>
using namespace std;
int xx[100005];
int cc[100005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int minn=10000000;
        int mini;
        int cnt=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&xx[i]);
            if(xx[i]<minn)
            {
                minn=xx[i];
                mini=i;
            }
        }
        if(n==1)
            cout<<1<<endl;
        else if(n==2)
        {
            if(xx[0]!=xx[1])
                cout<<3<<endl;
            else
                cout<<2<<endl;
        }
        else
        {
            memset(cc,0,sizeof(cc));
            long long ans1=0;
            int minii=mini;
            cc[mini]=1;
            cnt=1;
            ans1+=1;
            while(cnt<=n-1)       //顺时针
            {
                mini+=1;
                mini%=n;
                if(xx[(mini-1+n)%n]<xx[mini] && xx[mini]>xx[(mini+1)%n] )
                    cc[mini]=max(cc[(mini-1+n)%n],cc[(mini+1)%n])+1;
                else if(xx[(mini-1+n)%n]<xx[mini] )
                    cc[mini]=cc[(mini-1+n)%n]+1;
                else if(xx[mini]>xx[(mini+1)%n])
                    cc[mini]=cc[(mini+1)%n]+1;
                if(cc[mini]==0)
                    cc[mini]=1;
                cnt++;
                   // cout<<mini<<" "<<cc[mini]<<endl;
                   ans1+=cc[mini];
            }
            memset(cc,0,sizeof(cc));
            long long ans2=0;
            mini=minii;
            cc[mini]=1;
            cnt=1;
            ans2+=1;
            while(cnt<=n-1)     //逆时针
            {
                mini-=1;
                if(mini<0)
                    mini+=n;
                mini%=n;
                if(xx[(mini-1+n)%n]<xx[mini] && xx[mini]>xx[(mini+1)%n] )
                    cc[mini]=max(cc[(mini-1+n)%n],cc[(mini+1)%n])+1;
                else if(xx[(mini-1+n)%n]<xx[mini] )
                    cc[mini]=cc[(mini-1+n)%n]+1;
                else if(xx[mini]>xx[(mini+1)%n])
                    cc[mini]=cc[(mini+1)%n]+1;
                if(cc[mini]==0)
                    cc[mini]=1;
                cnt++;
                   // cout<<mini<<" "<<cc[mini]<<endl;
                   ans2+=cc[mini];
            }
            cout<<max(ans1,ans2)<<endl;
        }
    }
    return 0;
}
#include <iostream>
#include <vector>
#include <queue>
#define maxn 100001
using namespace std;
vector<int>G[maxn];
int deg[maxn], wei[maxn];
void addedge(int from, int to) {
    ++deg[from];
    G[to].push_back(from);
}
int main() {
    int n,T;
    
    cin >> T;
    while(T--){
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> wei[i];
        }
        for (int i = 0; i < n; i ++) {
            int las = (i - 1 + n) % n;
            if (wei[las] < wei[i]) {
                addedge(i, las);
            } else if (wei[las] > wei[i]) {
                addedge(las, i);
            }
        }
        int cnt = 1, ans = 0, nodes = 0;
        queue<int>que;
        bzero(wei, sizeof(wei));
        while (nodes != n) {
            for (int i = 0; i < n; i ++) {
                if (deg[i] == 0 && !wei[i]) {
                    wei[i] = 1;
                    ans += cnt;
                    que.push(i);
                    ++nodes;
                }
            }
            while (!que.empty()) {
                int t = que.front();
                que.pop();
                for (int i = 0; i < G[t].size(); i++) {
                    --deg[G[t][i]];
                }
            }
            ++cnt;
        }
        cout << ans<< endl;
    }
}

#第四题

题目大意

有n根长度为Li的绳子

需要m根相同长度的绳子

问最大的相同长度是多少 二分裸题 精度一开始开了1e-5 改了1e-4过了

#include <iostream>
#include <cstdio>
#include <math.h>
#include<algorithm>
using namespace std;
int c[100005];
int main()
{
    long long n,m;
    cin>>n>>m;
    long long sum=0;
    for(int i=0;i<n;i++)
      {
           cin>>c[i];
           sum+=c[i];
      }
    if(sum<m)
        cout<<"0.00"<<endl;
    else
    {
        double l,r,mid;
        l=0,r=1000000009;
        long long cnt=0;
        while((r-l)>1e-4)
        {
            mid=(l+r)/2;
            cnt=0;
            for(int i=0;i<n;i++)
            {
                cnt+=int(c[i]/mid);
            }
           // cout<<cnt<<endl;
            if(cnt<m)
                r=mid;
            else
                l=mid;
        }
        printf("%.2lf\n",mid);
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值