牛客小白月賽41


牛客小白月賽41

A.小紅的簽到題

題意

已知改版的小白月賽一共有a道題,一共有b人參賽,所有人通過題目數量的總數為c道。問最多有多少人ak?

思路
簽到題目,直接c/a就行了

代碼

#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
const int N=110;

typedef long long LL;

int main()
{
    IOS;
    int a,b,c;
    cin>>a>>b>>c;
    cout<<c/a<<endl;
    return 0;
}

B.小紅的ABC

題意

小紅拿到了一個只包含 'a' , 'b' , 'c' 三種字符的字符串。
小紅想知道,這個字符串最短的、長度超過 1 的回文子串的長度是多少?

思路
最短的長度超過1的回文子串只有三種可能,不存在,2或3,所以直接遍歷便可以得出答案。

代碼

#include<bits/stdc++.h>

using namespace std;

#define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

const int N=110;
typedef long long LL;
string s;

int main()
{
    cin>>s;
    int i=0,j=1;
    int flag=false,flag1=false; //是否出現了2和3的情況
    for(int i=0;i<s.length();i++)
    {
        if(s[i]==s[i+1])
            flag=true;
        if(s[i]==s[i+2])
            flag1=true;
    }
        
    if(flag)
        cout<<2<<endl;
    else if(flag1)
        cout<<3<<endl;
    else 
        cout<<-1<<endl;
    return 0;
}

C.小紅的口罩

題意

小紅網購了n個口罩。
眾所周知,戴口罩是很不舒服的。小紅每個口罩戴一天的初始不舒適度為ai
小紅有時候會將口罩重復使用(注:這是非常不衛生的!),每次重復使用時,該口罩的不舒適度會翻倍
小紅想知道,自己在不舒適度總和不超過k的情況下,最多能用現有的口罩度過多少天?

思路
每次都選擇舒適度最小的口罩戴上,之后將其舒適度翻倍重新排序,很明顯我們可以用小根堆來解決這個問題。

代碼

#include<bits/stdc++.h>

using namespace std;

#define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

const int N=1e5+10;

priority_queue<int ,vector<int> ,greater<int> >q;


typedef long long LL;

LL a[N];
int cnt;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++){  //輸入數據
        int x;
        cin>>x;
        q.push(x);
    }
    
    while(k>=0)
    {
        int x=q.top();
        if(k>=x)  
        {
            k-=x;
            x*=2;   //舒適度加倍后重新入隊
            q.pop();
            q.push(x);
            cnt++;
        }
        else  
            break;
    }
    cout<<cnt<<endl;
    return 0;
}

D.小紅的數組

題意

小紅拿到了一個長度為 n的數組,數組中的元素都是正整數。
小紅想讓你回答以下三個問題,取兩個數乘積大於k的方案數、取兩個數乘積等於k的方案數、取兩個數乘積小於k的方案數。

思路
二分
排序后遍歷數組有三種情況:
1.如果a[i]*a[i+1]>k,那么從i+1~n有n-i-1個數乘a[i]都會>k。
2.如果a[i]*a[n]<k,那么從i+1~n也有n-i-1個數乘a[i]也會<k。
3.如果a[i]*a[i+1]=k 或者 a[i]*a[n]=k,首先我們要二分查找出左邊界L為>=k/a[i]的第一個數和右邊界R為>k/a[i],其中我們又要分兩種情況來判斷:

  • a :如果k%a[i]=0:
    那么從i-1~L的數乘上a[i]<k, L~R的數乘上a[i]=k,R~n的數乘上a[i]>k
  • b :如果k%a[i]!=0:
    那么就不會存在等於k的情況,所以有R~n個數乘a[i]>k,i-1~R個數乘a[i]<k

代碼

#include<bits/stdc++.h>

using namespace std;

#define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

const int N=3e5+10;

typedef long long LL;

LL n,k;
LL  a[N];
LL k1,k2,k3;

int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)  cin>>a[i];

    sort(a,a+n);

    for(int i=0;i<n-1;i++)
    {
        if(a[i]*a[i+1]>k) k1+=n-i-1;
        else if(a[i]*a[n-1]<k)  k3+=n-i-1;
        else {
            int p=lower_bound(a+i+1,a+n,k/a[i])-a;
            int q=upper_bound(a+i+1,a+n,k/a[i])-a;
            
            if(k%a[i]!=0)
            {
                k1+=n-q;
                k3+=q-i-1;
            }
            else
            {
                k3+=p-i-1;
                k1+=n-q;
                k2+=q-p;
            }
        }
    }
    cout<<k1<<' '<<k2<<' '<<k3<<endl;
    return 0;
}

QAQ~ 困了睡覺咯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM