这是L,K,C,E,B,G的题解,别问为什么替他的没有,问就是不会😢
L
首先是L,很简单的签到题,直接亮代码👌
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int x=1;x<=10;x++){
if(n*x%10==0){
cout<<x;
break;
}
}
return 0;
}
K
K是一道数学题,举举例子就会发现只有“1”和“3”有答案,知道后就十分简单了😎
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int j=0;j<t;j++){
int n;
cin>>n;
if(n==1){
cout<<"YES"<<endl<<1<<endl;
}else if(n==3){
cout<<"YES"<<endl<<1<<" "<<2<<" "<<3<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
C
c是一道思维题,因为可以多次操作的原因,本可以全部都是最大值(前提是n>=3哦,n==1 or n==2要分类了),但题目说是开区间,所以要分类了😥,如果最大值不在头和尾,那么除了头和尾都可以变成最大值,如果在头则尾变不了,反之,在尾则头变不了😊,代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int j=0;j<t;j++){
int n;
cin>>n;
long long a[500005];
long long maxi=0;
int wezhi=1;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>maxi){
maxi=a[i];
wezhi=i;
}
}
if(n==1){
cout<<a[1]<<endl;
continue;
}else if(n==2){
cout<<a[1]+a[2]<<endl;
continue;
}
if(wezhi==1){
cout<<maxi*(n-1)+a[n]<<endl;
}else if(wezhi==n){
cout<<a[1]+maxi*(n-1)<<endl;
}else{
cout<<maxi*(n-2)+a[1]+a[n]<<endl;
}
}
return 0;
}
E
这道题很简单,就是相邻两个加起来找最大值,当然还有k和头及尾的和值,代码如下😘
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int j=0;j<t;j++){
int n,k;
cin>>n>>k;
int a[200005];
int maxi=-2000000;
for(int i=1;i<=n;i++){
cin>>a[i];
if(i>1&&a[i]+a[i-1]>maxi){
maxi=a[i]+a[i-1];
}
}
if(a[1]>=a[n]&&k+a[1]>maxi){
maxi=k+a[1];
}else if(a[1]<a[n]&&a[n]+k>maxi){
maxi=k+a[n];
}
cout<<maxi<<endl;
}
return 0;
}
B
依旧思维题,因为得分要移除手牌,所以只要保证比小红最小的还小的牌在最后,让其不会卡在手里即可,并且题目只要求考虑小苯的最高分,所以不用考虑小红,只要把比小红最小的大的牌全排列*比小红最小的还小的牌全排列,即可(注意计算取余哦!!!)😉,代码如下:
#include<bits/stdc++.h>
using namespace std;
const int m=998244353;
int main(){
int t;
cin>>t;
for(int j=0;j<t;j++){
int n;
cin>>n;
int a[200005];
int b[200005];
int num_xiao=0;
int num_da=0;
int b_mini=2*n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
if(b[i]<b_mini){
b_mini=b[i];
}
}
for(int i=1;i<=n;i++){
if(a[i]<b_mini){
num_xiao++;
}else{
num_da++;
}
}
long long xiao=1;
long long da=1;
if(num_xiao==0||num_xiao==1){
for(int i=2;i<=num_da;i++){
da=da*i%m;
}
cout<<da%m<<endl;
}else if(num_da==1||num_da==0){
for(int i=2;i<=num_xiao;i++){
xiao=xiao*i%m;
}
cout<<xiao%m<<endl;
}else{
for(int i=2;i<=num_da;i++){
da=da*i%m;
}
for(int i=2;i<=num_xiao;i++){
xiao=xiao*i%m;
}
cout<<da*xiao%m<<endl;
}
}
return 0;
}
G
还是思维题,我的脑子要炸了🥲,我的方法简单粗暴,把可能的答案都比一遍,first,l本身倒序,second,最大位数减一,后边都是9(当然要考虑和r大小的关系),third,最大位数不变,后面尽量变成9(同样要考虑和r大小的关系),注意!!!这题r,l大的可怕,所以注意整数类型和处理方法😉,代码如下:
#include<bits/stdc++.h>
using namespace std;
long long solve(long long a){
long long res=0;
while(a>0){
int dig=a%10;
res=res*10+dig;
a/=10;
}
return res;
}
int main(){
int t;
cin>>t;
for(int j=0;j<t;j++){
long long l,r;
cin>>l>>r;
long long first=0;
long long second=0;
if(r%10==9){
first=solve(r);
}else{
int cnt=r%10;
long long cnt1=r-cnt-1;
if(cnt1>=l){
first=solve(cnt1);
}else{
first=solve(r);
}
}
long long cnt2=r;
long long num=1;
while(cnt2>0){
cnt2/=10;
num*=10;
}
num/=10;
if((r/num-1)*num+(num-1)>=l&&(r/num-1)*num+(num-1)<=r){
second=solve((r/num-1)*num+(num-1));
}
long long ans=max(first,second);
long long tenk=10;
for(int k=1; k<=16;k++){
long long third=(r/tenk)*tenk+(tenk - 1);
if(third>r){
if(r/tenk==0)break;
third=(r/tenk-1)*tenk+(tenk - 1);
}
if(third>=l&&third<=r){
ans=max(ans,solve(third));
}
tenk*=10;
if(tenk>r*10)break;
}
ans=max(ans,solve(l));
ans=max(ans,solve(r));
cout<<ans<<endl;
}
return 0;
}

京公网安备 11010502036488号