牛客网练习场33

版权声明:Dream_dog专属 https://blog.csdn.net/Dog_dream/article/details/84930152

1-题解:简单题

#include<bits/stdc++.h>
#define clr(a,b)  memset(a,b,sizeof(a))
#define pb(a)     push_back(a);
using namespace std;
typedef long long ll;
const int maxn=100+2;
const int minn=100+2;
ll l,r,x;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld",&l,&r,&x);
        printf("%lld\n",(r/x)-(l/x)+(l%x==0?1:0));
    }
    return 0;
}

2-题解:有坑点相同的数量也要计算

#include<bits/stdc++.h>
#define clr(a,b)  memset(a,b,sizeof(a))
#define pb(a)     push_back(a);
using namespace std;
typedef long long ll;
const int maxn=100+2;
const int minn=100+2;
int n,k;
int nums[maxn],cnt[maxn];
set<int> se;
int main()
{
    int tm;
    while(~scanf("%d%d",&n,&k))
    {
        clr(nums,0);
        clr(cnt,0);
        se.clear();
        for(int i=0;i<n;i++)
        {
            scanf("%d",&tm);
            se.insert(tm);
            nums[tm]++;
        }
        int ans=0,sum=k;
        for(auto i:se)
        {
            for(int j=1;j*i<=k;++j)
            {
                cnt[i*j]+=nums[i];
                if(cnt[i*j]==ans)
                {
                    sum++;
                }
                else if(cnt[i*j]>ans)
                {
                    sum=1;
                    ans=cnt[i*j];
                }
            }
        }
        printf("%d %d\n",ans,sum);
    }
    return 0;
}

3-题解:判断是不是8的倍数只需要判断个十百位就好,所以我们可以单独判断这三位对于长度小于3的直接判断、长度大于三的从0跑到999然后把没有计算的字符从大到小加到前面每次判断字符串大小(因为长度和字符个数相同所以按字典序也可以判断)

#include<bits/stdc++.h>
#define clr(a,b)  memset(a,b,sizeof(a))
#define pb(a)     push_back(a);
using namespace std;
typedef long long ll;
const int maxn=100+2;
const int minn=10+2;
string str,ans;
int nums[minn];
int main()
{
   int t,a,b,c,flag;
   cin>>t;
   while(t--)
   {
       cin>>str;
       if(str.size()==1)
       {
           if((str[0]-'0')%8==0){cout<<str<<endl;}
           else puts("-1");
       }
       else if(str.size()==2)
       {
           int tm1=(str[0]-'0')+(str[1]-'0')*10;
           int tm2=(str[1]-'0')+(str[0]-'0')*10;
           tm1=tm1%8?-1:tm1;tm2=tm2%8?-1:tm2;
           cout<<max(tm1,tm2)<<endl;
       }
       else
       {
            clr(nums,0);flag=0;ans.clear();
            for(auto i:str){nums[i-'0']++;}
            for(int k=0;k<1000;k+=8)
            {
                a=k%10;b=k/10%10;c=k/100;//分别代表各位十位百位
                nums[a]--;nums[b]--;nums[c]--;
                if(nums[a]>=0&&nums[b]>=0&&nums[c]>=0)
                {
                    str.clear();flag=1;
                    for(int i=9;i>=0;--i)
                    {
                        for(int j=0;j<nums[i];++j)str+=i+'0';
                    }
                    str+=c+'0';str+=b+'0';str+=a+'0';
                    if(str>ans)ans=str;//因为长度相同判断字典序大小
                }
                nums[a]++;nums[b]++;nums[c]++;
            }
            if(flag)cout<<ans<<endl;
            else puts("-1");
       }
   }
    return 0;
}

4-题解:运用树状数组记录逆序个数

#include<bits/stdc++.h>
#define clr(a,b)  memset(a,b,sizeof(a))
#define pb(a)     push_back(a);
#define il        inline
#define lowbit(x) x&-x
using namespace std;
typedef long long ll;
const int maxn=100000+2;
const int minn=10+2;
int n,tree[maxn];
il void  add(int x,int y)
{
    while(x<=n)
    {
        tree[x]+=y;
        x+=lowbit(x);
    }
    return ;
}
il int sum(int x)
{
    int res=0;
    while(x)
    {
        res+=tree[x];
        x-=lowbit(x);
    }
    return res;
}
int main()
{
    cin>>n;
    int tm,ans=0;
    int l,r,k,q;
    for(int i=1;i<=n;++i)
    {
         cin>>tm;
         add(tm,1);
         ans^=(i-sum(tm))&1;//sum(tm)代表在比tm小的数已经存在的有多少个
    }
    cin>>q;
    while(q--)
    { 
        cin>>l>>r>>k;
        k%=(r-l+1);
        if(k!=0){ans ^= ((k & 1) * (r - l + 1 - k)) & 1;}
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dog_dream/article/details/84930152
今日推荐