第一题

提示:一定要开long long

题目描述 小郡今天学习了求余运算,他很好奇求余运算和乘法运 算结合起来会是什么样子,于是他设计了这样的一道题目。给定数字nn,你可以任选一个数字k(1kn)k(1≤k≤n),然后计算出nn%k的值,记为qq,请问k×qk×q的最大值是多少。

错误原因 无,对了嘻嘻嘻😊😊😊

思路 通过观察样例推公式

正确代码

#include<bits/stdc++.h>
//#include<windows.h>
#pragma GCC optimize(3)
using namespace std;
int main(){
	freopen("mod.in","r",stdin);
	freopen("mod.out","w",stdout);
	ios::sync_with_stdio (0);
	cin.tie(0), cout.tie(0);
	long long n;
	cin>>n;
	cout<<(n/2+1)*(n-(n/2+1));
	return 0;
}

第二题

题目描述 给定一个字符串,请你提取出字符串中的所有数字,并且将每个数字加上55之后再求和。请注意:数字可能包含前导零,详见样例22。保证所有数字之和在long  longlong  long的范围内。

错误原因 因为样例2已为是每一位加起来不知到是数字连起来的算一坨

思路 暴力枚举字符串如果发现他是数字那就让他从这一位开始往后找如果是数字那么用公式要统计的数字=要统计的数字10+每一位找的数字字符0要统计的数字=要统计的数字*10+每一位找的数字字符-'0'

正确代码

#include<bits/stdc++.h>
//#include<windows.h>
#pragma GCC optimize(3)
using namespace std;
int main(){
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);
	ios::sync_with_stdio (0);
	cin.tie(0), cout.tie(0);
	long long n,sum=0;
	cin>>n;
	string s;
	cin>>s;
	for(int i=0;i<s.size();i++){
		long long t=0;
		if(s[i]>='0'&&s[i]<='9'){
			while(s[i]>='0'&&s[i]<='9'){
				t=t*10+s[i]-'0';
				i++;
			}
			sum+=t+5;
		} 
	}
	cout<<sum;
	return 0;
}

第三题

题目描述 小郡在玩打怪游戏,游戏共有nn个关卡,每通过一个关卡就会遇到一把武器,它的代号为 aiai,表示当你第 aiai次遇到代号为aiai的武器时,才能够获得这把武器(代号相同的武器可以认为是相同的武器)现在有mm次询问,每次指定一个关卡区间 [L,R][L,R],在通过这些关卡之后(小郡是一个高手,所以这些关卡都能通过),小郡需要从获得的武器中选出 kiki个(保证 ki4ki≤4)来与怪物对决,你需要输出你有多少种组合方案。

错误原因 没有写 思路 写前缀和取区间武器和

正确代码

#include <bits/stdc++.h>
using namespace std;
int n,a[100010],c[100010];
int m,cnt,mp[450][100010],b[450];
int zh(int x,int y){
	if(x==1) return y;
	if(x==2) return y*(y-1)/2;
	if(x==3) return y*(y-1)*(y-2)/6;
	if(x==4) return y*(y-1)*(y-2)*(y-3)/24;
}
int main(){
	freopen("wq.in","r",stdin);
	freopen("wq.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]>n) continue;
		c[a[i]]++;
		if(c[a[i]]==a[i]) b[++cnt]=a[i];
	}
	for(int i=1;i<=cnt;i++){
		for(int j=1;j<=n;j++){
			if(a[j]==b[i]) mp[i][j]=mp[i][j-1]+1;
			else mp[i][j]=mp[i][j-1];
		}
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		int l,r,k,sum=0;
		cin>>l>>r>>k;
		for(int j=1;j<=cnt;j++){
			if(mp[j][r]-mp[j][l-1]>=b[j]) 
                sum++;
		}
		cout<<zh(k,sum)<<endl;
	}
	return 0;	
}

0 条评论

目前还没有评论...