测试得分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,⋯,SnS1,S2,⋯,Sn。
定义数组 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 个食材的价格是 vivi。
今天超市正在进行促销活动,每满两个商品,都可以进行促销活动,使用两个商品中最高价格购买当前这两件商品。
为了节省金钱,小可还在线购买了 kk 张超市折扣券,每两件商品可以使用一张折扣券,使用两个商品中最低价格购买当前这两件商品。
注意:商品不能重复参加活动。
请问小可购买清单中所有物品都购买后,最低花费多少元。
输入格式
第一行输入两个整数 n,kn,k,含义如题所示。
第二行输入 nn 个整数 vivi,数字以空格分隔,表示每个食材价格。
输出格式
输出一行包含一个整数,表示小可购买清单中所有物品都购买后,最低花费多少元。
分析
得了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;
}

3万+

被折叠的 条评论
为什么被折叠?



