Codeforces Round 112 (Rated for Div. 2)简训

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值