ACM2020两小时训练2补题
A - Integers Shop
题意:一个人去商场里买区间数,商品是都自带左端点、右端点、价格,从左端点到右端点的数可以全部拥有,最后完成购物后,获得的数字是最大的右端点到最小的左端点的所有数,要求在获得最多数字的前提下花费尽可能地小。
题解:只需记录左端点最小值中的花费最小值,右端点最大值中的花费最小值,还需记录长度最长的区间的花费最小值,输出结果时,结果只能取决于两条线段或者一条线段,若是两条线段,则直接左端点最小值中花费最小的那个线段和右端点最大值中花费最小的那个线段在一起就好了,要是一条线段的话,肯定是最长的且最便宜的那条。(需要总结规律、、难点)
#include <iostream>
using namespace std;
int main() {
int t;
cin>>t;
while(t--) {
int n;
cin>>n;
int maxl=2e9;
int maxr=0;
int maxlen=0;
int costlen=0;
int fl=0;
int fr=0;
while(n--) {
int l,r,s;
scanf("%d%d%d",&l,&r,&s);
if(l<maxl) {
maxl=l;
fl=s;
}else if(l==maxl){
fl=min(fl,s);
}
if(r>maxr){
maxr=r;
fr=s;
}else if(r==maxr){
fr=min(fr,s);
}
if(maxlen<r-l+1){
maxlen=r-l+1;
costlen=s;
}else if(maxlen==r-l+1){
costlen=min(s,costlen);
}
int res=fr+fl;
if(maxlen==maxr-maxl+1)res=min(res,costlen);
cout<<res<<endl;
}
}
}
B - Palindromes Coloring
题意:给定一个长度为n的字符串,将其分成m组,并且每组字符串都是回文串,可以有多余的字符不被分组。要求m组回文串中的最短长度最长。
因为题目给了一种操作是同组内的字符可以互换位置,所以只需考虑组内有多少对字符对即可,同时要是再有个单独的字符就更好了。
题解:将字符串中的字符对统计下来,看总共有多少对字符对。若字符对的数量小于需要的分组数,则最短的回文串长度最长为1 –此为重点需仔细考虑。若大于,还需额外考虑能否能再有一个单独的字符。这个单独的字符可以来自多余的字符对,也可以来自多余的字符,能分配到最短回文串的前提是,其他的回文字符都能分配到了–**此亦为重点。**然后输出结果即可。
总结:考察点感觉不难,但思维不清晰,题意理解有问题,没有完全理解题意,还有思维漏洞存在。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int t1,t2;
scanf("%d%d",&t1,&t2);
getchar();
string str;
getline(cin,str);
int a[30];
memset(a,0,sizeof(a));
for(int i=0;i<t1;i++){
a[str[i]-'a']++;
}
int dui=0,ji=0;
for(int i=0;i<26;i++){
dui+=a[i]/2;
ji+=a[i]%2;
}
if(dui<t2){
cout<<1<<endl;//思维漏洞
continue;
}
int sum=dui/t2*2;
int p=dui%t2;
if(p*2+ji>=t2){//没想到,考虑不仔细,思维不缜密
sum++;
}
cout<<sum<<endl;
}
}
C - Not Sitting
题意:给定一个二维表格,两个人一个向和另一个人离得近,一个想远离另一个人。想远离的那个人可以选择另一个人不能坐在哪,能选择的格子越来越多。
题解:最远距离肯定是四个角,只需遍历n*m矩阵的所有元素,求其到四个角的最大距离即可。然后放到优先队列中输出即可。
总结:超级简单的题,一点点博弈论在里面,只需找出结论即可解题,题意没敢看,,,一看图就固化思维认为自己没法做,不太好。缺乏自信。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int t1,t2;
scanf("%d%d",&t1,&t2);
getchar();
string str;
getline(cin,str);
int a[30];
memset(a,0,sizeof(a));
for(int i=0;i<t1;i++){
a[str[i]-'a']++;
}
int dui=0,ji=0;
for(int i=0;i<26;i++){
dui+=a[i]/2;
ji+=a[i]%2;
}
if(dui<t2){
cout<<1<<endl;//思维漏洞
continue;
}
int sum=dui/t2*2;
int p=dui%t2;
if(p*2+ji>=t2){//没想到,考虑不仔细,思维不缜密
sum++;
}
cout<<sum<<endl;
}
}