Educational Codeforces Round 112 (Rated for Div. 2)

A题:PizzaForces
题意:要烤n片披萨,有三个方案分别为:6片-15min,8片-20min,10片-25min。请问最少需要多少时间至少烤n片。
数据范围:多组输入t<1e4,n<1e16
样例解释
输入:
6
12
15
300
1
9999999999999999
3
输出:
30
40
750
15
25000000000000000
15
思路:三种方式的单位时长相同,又因为通过6,8,10可以组合出任意大于6的偶数,特判+数学计算
分类:数学
通过代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
	int t;
	cin>>t;
	while(t--) {
		ll n;
		cin>>n;
		cout<<((n<=6)?15:((n+1)/2*5))<<endl;
	}
	return 0;
}

B题:Two Tables
题意:给定平面大小,矩形1位置大小和矩形2大小,问矩形1最少移动多少格可以在平面上放下矩形2
数据范围:多组输入t<5000,W,H<1e8
样例解释
输入:
5
8 5
2 1 7 4
4 2
5 4
2 2 5 4
3 3
1 8
0 3 1 6
1 5
8 1
3 0 6 1
5 1
8 10
4 5 7 8
8 5
输出:
1.000000000
-1
2.000000000
2.000000000
0.000000000
思路:新矩形放在角落永远最优,比较放在不同角落的大小即可。
分类:贪心
通过代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int t;
	cin>>t;
	while(t--) {
		int flag;
		int n,m,x1,y1,x2,y2,w,h;
		cin>>n>>m>>x1>>y1>>x2>>y2>>w>>h;
		int ans=1e9;
		if (w+(x2-x1)<=n) {
			ans=min(ans,x2-n+w);
			ans=min(ans,w-x1);
			if(ans<0)ans=0;
		}
		if(h+(y2-y1)<=m){
			ans=min(ans,y2-m+h);
			ans=min(ans,h-y1);
			if(ans<0)ans=0;
		}
		if(ans!=1e9)cout<<ans<<endl;
		else cout<<-1<<endl;
	}
	return 0;
}

C题:Coin Rows
题意:给定2*n的矩阵,A和B均从(1,1)出发到(2,n),每次只能向右或向下走。A先走,走过路径上的值归0;B后走,获得走过路径上的值。
A想使B获得值最小,B想使自己获得值最大,请问B能获得多少值。
数据范围:多组输入t<1e4,n<1e5,ai<1e4
样例解释
输入:
3
3
1 3 7
3 5 1
3
1 3 9
3 5 1
1
4
7
输出:
7
8
0
思路:发现在A以任意种方式走完后,B只有两种最大化可能方案,用前缀和处理区间和比较即可。
分类:前缀和
通过代码:

#include<bits/stdc++.h>
using namespace std;
int dp1[100005],dp2[100005];
int sum1[100005],sum2[100005];
int main() {
	int t;
	cin >> t;
	while(t --) {
		int n;
		cin>>n;
		for(int i=1; i<=n; i++)cin>>dp1[i];
		for(int i=1; i<=n; i++)cin>>dp2[i];
		for(int i=1; i<=n; i++)sum1[i]=sum1[i-1]+dp1[i];
		for(int i=1; i<=n; i++)sum2[i]=sum2[i-1]+dp2[i];
		int maxx=1e9;
		for(int i=1; i<=n; i++) {
			maxx=min(maxx,max(sum1[n]-sum1[i],sum2[i-1]));
		}
		cout<<maxx<<endl;
	}
	return 0;
}

D题:Say No to Palindromes
题意:给定只有abc的字符串s,每次给定一个区间,请问要至少修改多少个字符,才能使区间内没有回文串。
数据范围:多组输入t<1e4,n,m<2e5
样例解释
输入:
5 4
baacb
1 3
1 5
4 5
2 3
输出:
1
2
0
1
思路:暴力枚举最终可能的组合,前缀和处理区间内需要修改的字符,最后比较。
分类:前缀和
通过代码:

#include<bits/stdc++.h>
using namespace std;
int ans[10][200005],b[10][200005];
int main() {
	int n,m;
	string s;
	cin>>n>>m>>s;
	s='?'+s+'?';
	b[1][0]='a',b[1][1]='b',b[1][2]='c';
	b[2][0]='a',b[2][1]='c',b[2][2]='b';
	b[3][0]='b',b[3][1]='a',b[3][2]='c';
	b[4][0]='b',b[4][1]='c',b[4][2]='a';
	b[5][0]='c',b[5][1]='b',b[5][2]='a';
	b[6][0]='c',b[6][1]='a',b[6][2]='b';
	for(int j=1; j<=6; j++) {
		for(int i=1; i<=n; i++) {
			if(s[i]==b[j][i%3]) ans[j][i]=ans[j][i-1];
			else ans[j][i]=ans[j][i-1]+1;
		}
	}
	while(m--) {
		int l,r;
		cin>>l>>r;
		int minn=1e9;
		for(int i=1; i<=6; i++) {
			minn=min(minn,ans[i][r]-ans[i][l-1]);
		}
		cout<<minn<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值