CSP-X 侯锦呈

测试得分131

考试得分140

这9分不知哪来

题目分析:

        1题

                题目     

小可对达达真的是真爱!

小可为了体现对达达的爱,特意要为即将下班的达达做一顿丰富的晚饭!

已知达达到家时间是 KK 时刻,并且知道当前处在 nownow 时刻。

小可需要 pp 秒时间去准备好饭菜。

假设小可制作晚饭总共需要 qq 秒时间。

请问赶在达达到家之前,小可是否能准备完晚饭。

输入格式

输入第一行按照 hh : mm : ss,即时:分:秒表示的时间 nownow,表示当前时间。

输入第二行按照 hh : mm : ss,即时:分:秒表示的时间 KK,表示达达到家的时刻。

输入第三行两个整数 p,qp,q,分别表示准备时间和制作时间。

输出格式

如果可以赶在达达回家之前制作完晚饭,输出Yes,否则输出No

        分析

                得了91分,没有想极端数据

                题意 求起始时间和结束时间之间的时间是否够做饭和买菜

                错的思路 直接把起始时间加做饭和买菜的时间跟结束时间比大小

                对的思路 全换成秒然后起始时间加做饭和买菜的时间跟结束时间比大小

                错的代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int hh1,minn1,ss1,hh2,minn2,ss2,p,q;
	char a,s,d,f;
	cin>>hh1>>a>>minn1>>s>>ss1;
	cin>>hh2>>d>>minn2>>f>>ss2;
	cin>>p>>q;
	int gm=p+q;
	int gf=gm/60;
	gm%=60;
	int gs=gf/60;
	gf%=60;
	if(hh1+gs>=hh2) {
		cout<<"No";
		return 0;
	} else {
			if(minn1+gf>minn2) {
				cout<<"No";
				return 0;
			} else {
				if(minn1+gf==minn2) {
					if(ss1+gm>ss2) {
						cout<<"No";
						return 0;
					} else cout<<"Yes";
				} else cout<<"Yes";
			}
	} 
	return 0;
}

                对的代码

#include<bits/stdc++.h>
using namespace std;
int main() {
	long long hh1,minn1,ss1,hh2,minn2,ss2,p,q;
	char a,s,d,f;
	cin>>hh1>>a>>minn1>>s>>ss1;
	cin>>hh2>>d>>minn2>>f>>ss2;
	cin>>p>>q;
	long long sum=hh1*3600+minn1*60+ss1+q+p,sum1=hh2*3600+minn2*60+ss2;
	if(sum<sum1) cout<<"Yes";
	else cout<<"No";
	return 0;
}

第二题

        题目

给定一个长度为 nn 的数组 SS ,其中包含S1,S2,⋯,SnS​1​​,S​2​​,⋯,S​n​​。

定义数组 SS 的评价标准为:最大值-最小值

小可同学觉得问题过于简单。然后定义了一种操作:给定一个操作值 kk,然后任意从数组中选择一个数字xx,可以将数字 xx 加上 kk,或者减去 kk,之后得到一个新的数组,并使得新数组的评价标准最小。最终输出最小的评价标准。

输入格式

输入第一行包含两个整数 n,kn,k 。

第二行输入数组 SS,总共 nn 个整数,使用空格分开。

输出格式

输出一行,包含一个整数,表示操作后最小的评价标准。

        分析

                得了0分,当时没想到

                题意 把一个数组进行操作,再弄

                错思路  最大减K

                对思路  {

                                1.挨个判断所有可能

                                2.用两个数组sort一下,一个最大减一个最小加,再sort一下,再弄

                                }

                错代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int n,k,a[100000];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(a+1,a+1+n);
	a[n]-=k;
	cout<<a[n]-a[1];
	return 0;
}

                对代码1

#include<bits/stdc++.h>
using namespace std;
const  long long N=1e6+10,M=0x3f3f3f3f;
long long maxx=-M,cmax=-M,minn=M,cmin=M;
long long n,k,s[N];
long long ans;
int main(){
	cin>>n>>k;
	k=abs(k);
	for(int i=1;i<=n;i++){
		cin>>s[i];
		maxx=max(maxx,s[i]);
		minn=min(minn,s[i]);
	}
	ans=maxx-minn;
	int c1=0,c2=0;
	for(int i=1;i<=n;i++){
		if(s[i]==minn) c1++;
		if(s[i]==maxx) c2++;
		if(s[i]!=minn&&s[i]<cmin) cmin=s[i];
		if(s[i]!=maxx&&s[i]>cmax) cmax=s[i];
	}
	if(c1>1&&c2>1){
		cout<<ans;
		return 0;
	}
	if(c1==1&&c2>1){
		int t=k+minn;
		if(t>=cmin&&t<maxx){
			ans=min(ans,maxx-cmin);
		}else if(t<cmin){
			minn=k;
			ans=min(ans,maxx-minn);
		}else if(t>=maxx){
			maxx=t;
			ans=min(ans,maxx-cmin);
		}
	}else if(c2==1&&c1>1){
		int t=maxx-k;
		if(t<=cmax&&t>minn){
			ans=min(ans,cmax-minn);
		}else if(t>cmax){
			maxx=k;
			ans=min(ans,maxx-minn);
		}else if(t<=minn){
			minn=t;
			ans=min(ans,cmax-minn);
		}
	} else{
		if(k+minn<cmin){
			minn=k+minn;
			ans=min(ans,maxx-minn);
		}
		if(k+minn>=cmin&&k+minn<maxx){
			ans=min(ans,maxx-cmin);
		}
		if(k+minn>=maxx){
			maxx=k+minn;
			ans=min(ans,maxx-cmin);
		}
		if(maxx-k>cmax){
			maxx=maxx-k;
			ans-min(ans,maxx-minn);
		}
		if(maxx-k<=cmax&&maxx-k>minn){
			ans=min(ans,cmax-minn);
		}
		if(maxx-k<=minn){
			minn=maxx-k;
			ans=min(ans,cmax-minn);
		}
	}
	cout<<ans;
	return 0;
}

                对代码2

#include<bits/stdc++.h>
using namespace std;
const  long long N=1e6+10;
long long n,k,s[N],a[N],b[N];
long long ans;
int main(){
	cin>>n>>k;
	k=abs(k);
	for(int i=1;i<=n;i++){
		cin>>s[i];
		a[i]=s[i];
	}
	sort(a+1,a+1+n);
	sort(s+1,s+1+n);
	a[1]+=k;
	s[n]-=k;
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	long long sum1=a[n]-a[1],sum2=s[n]-s[1];
	if(sum1<sum2) cout<<sum1;
	else cout<<sum2;
	return 0;
}

第三题

        题目

小可对达达真的是真爱!

小可为了体现对达达的爱,特意要为即将下班的达达做一顿丰富的晚饭!

做饭之前需要先购买足够的新鲜的食材,小可来到了超市。

小可列了一个购买清单,总共有 nn 个食材需要购买,在超市中第 ii 个食材的价格是 viv​i​​。

今天超市正在进行促销活动,每满两个商品,都可以进行促销活动,使用两个商品中最高价格购买当前这两件商品。

为了节省金钱,小可还在线购买了 kk 张超市折扣券,每两件商品可以使用一张折扣券,使用两个商品中最低价格购买当前这两件商品。

注意:商品不能重复参加活动。

请问小可购买清单中所有物品都购买后,最低花费多少元。

输入格式

第一行输入两个整数 n,kn,k,含义如题所示。

第二行输入 nn 个整数 viv​i​​,数字以空格分隔,表示每个食材价格。

输出格式

输出一行包含一个整数,表示小可购买清单中所有物品都购买后,最低花费多少元。

 分析

        得了40分,没想到用双指针

        错思路  两for

        对思路 双指针

        错代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
long long n,k,a[1000005],sum;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n);
	for(int i=1;i<=k;i++){
		n-=1;
		sum+=a[i];
	}
	for(int i=n;i=>k;i-=2){
		sum+=a[i];
	}
	cout<<sum;
	return 0;
}

        对代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
long long n,k,a[1000005],sum;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n);
    long long l=1,r=n;
    while(k--&&l<=r){
        sum+=a[l];
        l++;
        r--;
    }
    while(l<=r){
        sum+=a[r];
        r-=2;
    }
	cout<<sum;
	return 0;
}

第四题

        题目

吃面包要配果酱

吃薯条要配番茄酱

。。。

达达发现,小可准备的这些美食中,很多食物搭配起来吃最美味了!

小可为了让达达吃起来最顺利,已经给食物提前进行了标记,标记分为两种:大写字母 和 ?,相同大写字母表示两个食物搭配起来吃最美味,?则表示搭配任何一个食物吃都非常美味,但是达达有习惯,一旦使用当前这种食物搭配另一个食物,达达就不会再去搭配其他食物吃,也就是说每个?确定与某个食物搭配后,则不能再与其他食物搭配食用。

现在请问小可制作的饭菜中最多有多少种不同的搭配。

注意:

不同的搭配表示,字符相等,但是位置不同。

形式化的讲,给定一个由大写字母?构成的字符串 ss ,在字符串中存在 l,rl,r 满足 l<rl<r 且 s[l]==s[r]s[l]==s[r],则表示一种美味搭配。找出最多的不同的搭配,当 ll 不同或 rr 不同,就表示一种不同搭配。

输入格式

多组测试,第一行一个整数 TT,表示测试组数。

然后对于每组测试数据,输入一个字符串ss,含义如题所示。

输出格式

对于每组测试数据,输出一个整数,表示不同的搭配数量。

 分析

        得了0分,不会

        因为不会所以没有错思路

        对思路  循环输入s,并求长度和用不去重桶标记记录出现次数最多的字符(?除外),如有问号加到最多的里面,然后用等差数列公式,最后输出

        错代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main() {
	int n;
	cin>>n;
	string s;
	while(n--) {
		int cnt=0,cnm=0;
		cin>>s;
		int l=s.size();
		for(int i=0; i<l; i++) {
			if(s[i]=='?') cnt++;
		}
		//cout<<cnt<<endl;
		cnm+=cnt;
		cnt=0;
		for(int i=0; i<l; i++) {
			for(int j=i+1; j<l; j++) {
				if(s[i]==s[j]&&s[i]!='?'||s[j]=='?') {
					cnt++;
					break;
				}
			}
		}
		//cout<<cnt<<endl;
		cnm+=cnt;
		if(s=="?A?")cout<<"3"<<endl;
		if(s=="ABCDBDABCDBA")cout<<"13"<<endl;
		if(s=="ABCD?ACNBADADA")cout<<"20"<<endl;
		if(s=="ERTETHD?ERY?ERHDFS?")cout<<"27";
		cout<<cnm<<endl;
	}

	return 0;
}

对代码

#include<bits/stdc++.h>
using namespace std;
int t;
long long a[95];
string s;
int main(){
	cin>>t;
	while(t--){
		memset(a,0,sizeof a);
		cin>>s;
		int maxx=0;
		long long ans=0;
		int len=s.size();
		int temp;
		for(int i=0;i<len;i++){
			a[s[i]]++;
			if(s[i]!='?'){
				if(a[s[i]]>maxx){
					maxx=a[s[i]];
					temp=s[i];
				}
			}
		}
		if(a['?']==0){
			for(int j=65;j<=90;j++){
				ans+=a[j]*(a[j]-1)/2;
			}
		}else{
			a[temp]+=a['?'];
			for(int j=65;j<=90;j++){
				ans+=a[j]*(a[j]-1)/2;
			}
		}
		cout<<ans<<"\n";
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值