CSP-J 复赛模拟题4 解析

需要注意的是,每次操作询问之后都不会对原序列进行修改,即每次操作都是在原序列上直接进行的。
就是说把到l到r之间的所有数用cnt每次加p就行了 

根据解析写代码1:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=1e5;
LL a[N],n,ans,l,r,p,k,T;
LL pre[N],suf[N];
int main(){
	cin>>n>>T;
	for(int i=1;i<=n;i++){
		cin>>a[i],pre[i]=pre[i-1]+a[i];
	}
	for(int i=n;i>0;i--)
	suf[i]=suf[i+1]+a[i];
	while(T--){
		cin>>l>>r>>p>>k;
		LL tot=pre[l-1]+(r-l+1)*p+suf[r+1];
		if(tot%k==0)
		cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
} 

就是求2^n,3^m相乘后大于r小于L,cnt++ 

根据解析写代码2: 

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=5e5+5;
LL l,r,ans;
LL a[100];
int main(){
	cin>>l>>r;
	a[0]=1;
	for(int i=1;i<=60;i++){
		a[i]=a[i-1]*2;
	}
	for(int i=0;i<=60;i++){
		LL base=1;
		while(a[i]*base<=r){
			if(a[i]*base>=l){
				ans++;
			}
			base*=3;
		}
	}
	cout<<ans;
	return 0;
} 

此题为水题,不讲解 

无解析写代码3:

#include <bits/stdc++.h>
using namespace std;
string s;
bool ans(string s){
	int len=s.length();
	string a;
	for(int i=len-1;i>=0;i--){
		a+=s[i];
	}
	if(a==s){
		return true;
	}else{
		return false;
	}
}
int main(){
	int n;
	cin>>n;
	while(n--){
		cin>>s;
		int len=s.length();
		for(int i=0;i<=len;i++){
			if(s[i]>='A' && s[i]<='Z'){
				s[i]+=32;
			}
		} 
		if(ans(s)){
			cout<<"Yes\n";
		}else{
			cout<<"No\n";
		}
	}
	return 0;
} 

此题为水题,不讲解

 无解析写代码4:

#include <bits/stdc++.h>
using namespace std;
string s;
int main(){
	int n;
	cin>>n;
	int cnt=0;
	while(n--){
		cin>>s;
		int len=s.length();
		if(len==5){
			if(s[2]==s[4]){
				if(s[0]!=s[1] && s[0]!=s[2] && s[0]!=s[3] && s[1]!=s[2] && s[1]!=s[3] && s[2]!=s[3]){
					cnt++;
				}
			}
		}
	}
	cout<<cnt;
	return 0;
} 

那就是计算n个摊位的总钱(ans)
然后,判断s是否大于ans
    ·大于则s/ans,s%=ans,遍历每个摊位,看剩下的钱(t)能买多少个?s/ans+t
    ·小于则遍历每个摊位,看能买多少个

根据解析写代码5: 

#include <bits/stdc++.h>
using namespace std;
long long a[101010];
int main(){
	long long ans=0;
	long long n,s;
	cin>>n>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	long long x=0;
	while(1){
		long long num=0,cnt=0;
		for(int i=1;i<=n;i++){
			if(num+a[i]<=s){
				num+=a[i];
				cnt++;
			}
		}
		if(cnt==0){
			break;
		}
		long long round=s/num;
		ans+=round*cnt;
		s%=num;
	}
	cout<<ans;
	return 0;
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值