版权声明: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;
}