Codeforces Round 112 (Rated for Div. 2)简训
导语
日常
涉及的知识点
贪心,思维,前缀和
链接:Codeforces Round 112 (Rated for Div. 2
题目
A PizzaForces
题目大意:有三种规格的套餐,15分钟6个饼,20分钟8个饼,25分钟10个饼,现在来了n个人,需要每个人至少一个饼,求满足条件所需要花的最少时间
思路:这里有一个规律,任何大于10的偶数都可以用6,8,10这几个数的和来表示,这里就不证明了,那么n小于6的一定只能选择6,其他的偶数n也一定能拼出来,如果n是奇数,那么只能选择拼n-1加上一个6或者拼n+1,取花费最小值即可
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,n;
int main() {
scanf("%lld",&t);
while(t--) {
scanf("%lld",&n);
if(n%2==0) {
if(n<=6)
printf("15\n");
else
printf("%lld\n",n*5/2);
} else {
if(n<=6)
printf("15\n");
else
printf("%lld\n",min((n-1)*5/2+15,(n+1)*5/2));
}
}
return 0;
}
B Two Tables
题目大意:略
思路:第二个矩形为了保证第一个矩形移动最小,只能放在四个边角,并且第一个矩形只能水平移动或垂直移动,枚举四个边角即可
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=0x3f3f3f3f;
int t,W,H,xx,yy,x2,y2,w,h;
int main() {
scanf("%d",&t);
while(t--) {
scanf("%d%d",&W,&H);
scanf("%d%d%d%d",&xx,&yy,&x2,&y2);
scanf("%d%d",&w,&h);
int res=maxn;
if(x2-xx+w<=W) {
res=min(res,max(0,w-xx));
res=min(res,max(0,x2-W+w));
}
if(y2-yy+h<=H) {
res=min(res,max(0,h-yy));
res=min(res,max(0,y2-H+h));
}
if(res==maxn)printf("-1\n");
else printf("%.9f\n",(double)res);
}
return 0;
}
C Coin Rows
题目大意:略
思路:统计两行的前缀和与后缀和,对于A来说,(1,1)肯定已经拿了,A需要走的路是A走完后使B能获得的最大值最小,而不是A获得的最大,详细见代码
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=0x3f3f3f3f;
int a[2][121212],m,pre[2][121212],aft[2][121212],t;
int main() {
scanf("%d",&t);
while(t--) {
scanf("%d",&m);
int res=maxn;
pre[0][0]=pre[1][0]=aft[0][m+1]=aft[1][m+1]=0;
for(int i=1; i<=m; i++) {
scanf("%d",&a[0][i]);
pre[0][i]=pre[0][i-1]+a[0][i];
}
for(int i=1; i<=m; i++) {
scanf("%d",&a[1][i]);
pre[1][i]=pre[1][i-1]+a[1][i];
}
for(int i=m; i>=1; i--) {
aft[0][i]=aft[0][i+1]+a[0][i];
aft[1][i]=aft[1][i+1]+a[1][i];
}
for(int i=1; i<=m; i++)
if(res>max(pre[1][i-1],aft[0][i+1]))
res=max(pre[1][i-1],aft[0][i+1]);
printf("%d\n",res);
}
return 0;
}