学号:S12906
一、题目梗概
1.做饭(cook)
2.评价标准(criterion)
3.小可买菜(buy)(赛后通过)
4.美味佳肴(cuisine)
T1(cook):
问题描述
小可对达达真的是真爱!
小可为了体现对达达的爱,特意要为即将下班的达达做一顿丰富的晚饭!
已知达达到家时间是 K 时刻,并且知道当前处在 now 时刻。
小可需要 p 秒时间去准备好饭菜。
假设小可制作晚饭总共需要 q 秒时间。
请问赶在达达到家之前,小可是否能准备完晚饭。
输入格式
输入第一行按照 hh : mm : ss
,即时:分:秒
表示的时间 now,表示当前时间。
输入第二行按照 hh : mm : ss
,即时:分:秒
表示的时间 K,表示达达到家的时刻。
输入第三行两个整数 p,q,分别表示准备时间和制作时间。
输出格式
如果可以赶在达达回家之前制作完晚饭,输出Yes
,否则输出No
。
输入样例1
11:45:14
19:19:0
114 514
输出样例1
Yes
输入样例2
11:45:14
11:56:0
1145 14
输出样例2
No
提示
输入的 K 和 now 使用距离某个时刻之后的时分秒记录,可能不符合现实中的时间记录。
时间是24小时进制,时间的计算方式与现实生活中相同。
数据描述
使用 hh,min,ss 分别表示输入时刻中的时、分、秒。
对于 40%的数据:0≤ℎℎ≤23,0≤mm,ss≤59,0≤q,p≤10000≤hh≤23,0≤min,ss≤59,0≤p,q≤1000。
对于 100%的数据:0≤hh,min,ss≤1e6,0≤p,q≤1e8。
思路:把结束时刻算出来,再比个大小,挺简单的,就是别忘了换long long,还有就是注意是小于号。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
// freopen("cook.in","r",stdin);
// freopen("cook.out","w",stdout);
long long a,b,c,d,e,f,q,p;
scanf("%d:%d:%d",&a,&b,&c);
scanf("%d:%d:%d",&d,&e,&f);
scanf("%d%d",&p,&q);
long long t1=a*3600+b*60+c+q+p;
long long t2=d*3600+e*60+f;
if(t1<t2){
printf("Yes");
}
else{
printf("No");
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
T2(criterion):
问题描述
给定一个长度为 n 的数组S ,其中包含S1,S2,⋯,Sn。
定义数组 S 的评价标准为:最大值-最小值
。
小可同学觉得问题过于简单。然后定义了一种操作:给定一个操作值 k,然后任意从数组中选择一个数字x,可以将数字 x 加上 k,或者减去 k,之后得到一个新的数组,并使得新数组的评价标准最小。最终输出最小的评价标准。
输入格式
输入第一行包含两个整数 n,k 。
第二行输入数组 S,总共 n 个整数,使用空格分开。
输出格式
输出一行,包含一个整数,表示操作后最小的评价标准。
输入样例
5 114
19 19 810 114 514
输出样例
677
数据描述
对于 40% 的数据:2≤n≤100,0≤Si,K≤1000
对于 100%的数据:2≤n≤10e6,0≤∣Si∣,∣k∣≤1e8。
思路:当时看的这个题的时候,就想到用嵌套循环,算完时间复杂度后就没有思路了。赛后才发现考虑2~n-1就行了。但还是不会写。
T3(buy):
问题描述
小可对达达真的是真爱!
小可为了体现对达达的爱,特意要为即将下班的达达做一顿丰富的晚饭!
做饭之前需要先购买足够的新鲜的食材,小可来到了超市。
小可列了一个购买清单,总共有 nn 个食材需要购买,在超市中第 ii 个食材的价格是 vivi。
今天超市正在进行促销活动,每满两个商品,都可以进行促销活动,使用两个商品中最高价格购买当前这两件商品。
为了节省金钱,小可还在线购买了 k张超市折扣券,每两件商品可以使用一张折扣券,使用两个商品中最低价格购买当前这两件商品。
注意:商品不能重复参加活动。
请问小可购买清单中所有物品都购买后,最低花费多少元。
输入格式
第一行输入两个整数 n,kn,k,含义如题所示。
第二行输入 nn 个整数 vivi,数字以空格分隔,表示每个食材价格。
输出格式
输出一行包含一个整数,表示小可购买清单中所有物品都购买后,最低花费多少元。
输入样例1
4 1
1 2 3 4
输出样例1
4
输入样例2
10 2
1 3 2 4 7 8 9 6 3 8
输出样例2
20
数据描述
对于 40% 的数据:1≤n≤100,0≤k≤1,0≤vi≤100
对于 100%的数据:1≤n≤1e6,0≤k≤1e5,0≤vi≤1e6
思路:先给序列排个序,然后循环K次,然后双指针扫描一下。但没做出来。
AC代码:
#include<iostream>
#include<cstdio>
#include<iostream>
using namespace std;
int a[1000001];
int main(){
// freopen("buy.in","r",stdin);
// freopen("buy.out","w",stdout);
int k,n;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i){
scanf("%d",a+i);
}
sort(a+1,a+1+n);
long long sum=0;
for(int i=1;i<=k;++i){
sum+=a[i];
}
for(int i=n-k;i>k;i-=2){
sum+=a[i];
}
printf("%lld",sum);
// fclose(stdin);
// fclose(stdout);
return 0;
}
T4:
问题描述
吃面包要配果酱
吃薯条要配番茄酱
。。。
达达发现,小可准备的这些美食中,很多食物搭配起来吃最美味了!
小可为了让达达吃起来最顺利,已经给食物提前进行了标记,标记分为两种:大写字母
和 ?
,相同大写字母表示两个食物搭配起来吃最美味,?
则表示搭配任何一个食物吃都非常美味,但是达达有习惯,一旦使用当前这种食物搭配另一个食物,达达就不会再去搭配其他食物吃,也就是说每个?
确定与某个食物搭配后,则不能再与其他食物搭配食用。
现在请问小可制作的饭菜中最多有多少种不同的搭配。
注意:
不同的搭配表示,字符相等,但是位置不同。
形式化的讲,给定一个由大写字母
和?
构成的字符串 ss ,在字符串中存在 l,rl,r 满足 l<rl<r 且 s[l]==s[r]s[l]==s[r],则表示一种美味搭配。找出最多的不同的搭配,当 ll 不同或 rr 不同,就表示一种不同搭配。
输入格式
多组测试,第一行一个整数 TT,表示测试组数。
然后对于每组测试数据,输入一个字符串ss,含义如题所示。
输出格式
对于每组测试数据,输出一个整数,表示不同的搭配数量。
输入样例
4
?A?
ABCDBDABCDBA
ABCD?ACNBADADA
ERTETHD?ERY?ERHDFS?
SZD?S
输出样例
3
13
20
27
数据描述
假设 LL 表示字符串 ss 的长度。
对于 30%的数据,所有的 ss 中都不包含 ?
,1≤L≤1E3
对于 100%的数据,1≤T≤10,1≤L≤1E6
思路:开桶标记,最后加上“?”,但不会。