ACM2020两小时训练2补题

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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值