可达鸭模拟赛1补题报告s09795

        

1.比赛分数:

共四题,满分400,比赛中拿到0分,前4题每题得0分。

2.比赛过程:

第一题到第四题freopen写错了所以拿到0分。

3.题解报告:

(1)第一题:做饭

情况:赛中0分,已补题。

题意:可以发现时间都是合法时间,因此可以将p、q都加到开始时间,然后再做时间上的比较。但是这个过程细节较多,需要考虑是否跨天,并不易实现。
这部分分就是给想要模拟这个过程的同学准备的。
题解:观察 的数据,数据较大,因此可以考虑到,将所有时间转成秒,然后在秒上进行加法后再比较。注意输入的格式,使用scanf会比较方便一些。

AC代码:

#include<cstdio>
#include<iostream>
using namespace std;
long long nh,nm,ns;
long long kh,km,ks;
int main(){
	scanf("%lld:%lld:%lld",&nh,&nm,&ns);
	scanf("%lld:%lld:%lld",&kh,&km,&ks);
	long long zhun,zhi;
	cin>>zhun>>zhi;
	long long sum=(kh*3600+km*60+ks)-(nh*3600+nm*60+ns);
	if(sum>zhun+zhi){
		cout<<"Yes";
	}else{
		cout<<"No";
	}
	return 0;
} 

​(2):评价标准

情况:赛中0分,已补题

题意:给定一个序列,通过一个操作,可以让序列中的一个数加上或减去 。通过挑选处这个数字操作,使得这个序列的最大值减去最小值尽可能的小。

赛时想法:没想到怎么做,直接照着前四个测试点的数据测试的,但是只拿到0分

题解:

情况一:max
1、当前值加 后比最大值还大,成为新max。
2、当前值减 后比最小值还小,成为min。

新情况二:
1、当前值为原本最大值,减 后比原本次大值小,次大值成为新 。2、当前值为原本最小值,加 后比原本次小值大,次小值成为新 。由此,我们便可以 得找到新 ,总的时间复杂度为 。

AC代码: 

              

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

(3):小可买菜

情况:赛中0分,已补题。

题意:折扣券最多1张,那么就选择价格最高的食材去使用。其余的食材可以按照每两个付其中最高的一个的方式去进行。
这个过程需要排序。

赛时想法:没想到怎么做,暴力。

题解:在这个问题中,我们要使得价格最低,也就是将高价商品想办法通过低价购买。
在有优惠券的情况下,既然要最小化,那么我们可以将当前最小和当前最大捆绑在一起实现 。
在没有优惠劵的情况下,最大的价格是一定要花费的,使用最大带次大,一定是花费最小的方式。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
ll n,k;
ll a[N];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+1+n);
	ll l=1,R=n,sum=0;
	while(k--&&l<=R){
		sum+=a[l];
		l++;
		R--;
	}
	while(l<=R){
		sum+=a[R];
		R-=2;
	}
	cout<<sum;
	return 0;
}

​(4):美味佳肴

情况:赛时拿到0分,已补题。

题意:给你一个只包含 大写字母 和 ? 的字符串,这个字符串中的 ? 字符可以被同时看作任何字符。 现在你要计算最多有多少对(i,j) 满足 并且s[i]==s[j]。

赛事想法:没有任何思路打暴力得了0分。

题解:可以 的枚举每个字符,然后向后遍历找相等字符并计数。

AC代码:

#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";
	}

}

四.赛事总结:

因为freopen写错了所以拿到0分。我以后要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值