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;
}