BestCoder Round #69 (div.2) 总结

116 篇文章 0 订阅
16 篇文章 0 订阅

Baby Ming and Weight lifting

 
 Accepts: 335
 
 Submissions: 1474
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
铭宝宝喜欢举重运动,他有一个杠铃杆(重量忽略),和22种类型的杠铃片(重量分别为aabb),每种杠铃片都有无限个。
铭宝宝打算用这22种杠铃片组成重量为CC的杠铃(杠铃必须平衡),他想让你告诉他,应该如何组合。

输入描述
输入一个正整数T(1 \leq T \leq 1000)T(1T1000)表示测试组数
每组测试数据输入33个正整数a, b, C(0 < a,b,C \leq 1000)a,b,C(0<a,b,C1000), 表示22种杠铃片的重量,以及杠铃的重量。
输出描述
如果不能够组成重量为CC的杠铃,输出Impossible。
否则输出22个数,表示需要aa杠铃片的数量,和bb杠铃片的数量。(如果有多种答案,输出a+ba+b最小的方案)
输入样例
2
1 2 6
1 4 5
输出样例
2 2

Impossible

解:要是c%2!=0的话就不可能。其他的话就c/2枚举就行了

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a,b,c;
        int A=1e8,B=1e8;
        int MAX=1e8+10;
        int ok=0;
        scanf("%d%d%d",&a,&b,&c);
        if(c%2!=0)
        {
            printf("Impossible\n");
        }
        else
        {
            c/=2;
            for(int i=0;i<=c;i+=a)
            {
                for(int j=0;j<=c;j+=b)
                {
                    if(i+j==c&&MAX>(i/a+j/b))
                    {
                        MAX=i/a+j/b;
                        A=i/a*2;
                        B=j/b*2;
                    }
                }
            }
            if(MAX==1e8+10)
                printf("Impossible\n");
            else
                printf("%d %d\n",A,B);
        }
    }
    return 0;
}

Baby Ming and phone number

 
 Accepts: 111
 
 Submissions: 878
 Time Limit: 3000/1500 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
铭宝宝收集了很多手机号码,没错,他想卖手机号码赚钱。
他觉得有如下性质的手机号码可以卖aa元钱,其他的号码,只能卖bb元钱。
1.末5位数字相同(比如123-4567-7777)
2.末5位是连续递增或者连续递减的,且相邻数位相差1的数(比如188-0002-3456)
3.末8位是一个表示日期的数字,并且表示的日期在1980年1月1日至2016年12月31日内(比如188-1888-0809表示1888年8月9日)
铭宝宝想知道卖掉所有的手机号码能赚多少钱。
输入描述
输入T(T \leq 30)T(T30)表示TT组测试数据
输入n(n \leq 100,000)n(n100,000)表示铭宝宝有nn张手机号码(没有相同的手机号码)
输入22个正整数a, ba,b, 表示两种类型的手机号码分别能卖aa元和bb(b \leq 1000, a \leq 100,000)(b1000,a100,000)
接下去nn行,每行输入11个手机号码(|phonenumber|==11,首位非0)
输出描述
输出答案
输入样例
1
5
100000 1000
12319990212
11111111111
22222223456
10022221111
32165491212
输出样例
302000
解:根据题意做就行了
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
const int MAXN = 11000;
int ok(int year,int month,int day)
{
    if(year<1980 || year>2016 || month > 12 || month <= 0 || day >= 32 || day <= 0)
        return 0;
    int flag = 0;
    if(year%400==0 || (year%4==0 && year%100 != 0)){
        flag = 1;
    }
    if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){
        if(day<=31 && day>=1)
            return 1;
        else {
            return 0;
        }
    }
    else {
        if(month == 2){
            if(flag && day<=29 && day>=1)
                return 1;
            else if(!flag && day<=28 && day>=1){
                return 1;
            }
            else return 0;
        }
        else {
            if(day<=30 && day>=1)
                return 1;
            else
                return 0;
        }
    }
}
int main()
{
    int i,j,t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int a,b;
        char s[12];
        scanf("%d%d",&a,&b);
        LL ans = 0;
        for(i=1; i<=n; i++){
            scanf("%s",s);
            if(s[6]==s[7] && s[7]==s[8] && s[8]==s[9] && s[9]==s[10]){
                ans += (LL)a;
            }
            else if(abs(s[7]-s[6])==1 && s[7]-s[6] == s[8]-s[7] && s[8]-s[7]==s[9]-s[8] && s[9]-s[8]==s[10]-s[9]){
                ans += (LL)a;
            }
            else {
                int year = (s[3]-'0')*1000 + (s[4]-'0')*100 + (s[5]-'0')*10 + (s[6]-'0');
                int month = (s[7]-'0')*10 + (s[8]-'0');
                int day = (s[9]-'0')*10 + (s[10]-'0');
                if(ok(year,month,day)){
                    ans += (LL)a;
                }
                else {
                    ans += (LL)b;
                }
            }
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值