BestCoder 1st Anniversary ($) 1001 1002 1003

1001题:

题目要求是给你n,m,p,q;需要买n个,而单个买p元每个,q元m个,求花最少钱买>=n个

这题很水,细心一点就不会错。。

#include<iostream>
using namespace std;
int main()
{
    long long n,m,p,q;
    int T;
    cin>>T;
    while(T--){
        cin>>n>>m>>p>>q;
        double qq=q,mm=m;
        if(qq/mm>=p){
            cout<<p*n<<endl;
        }
        else{
            long long costp=n/m;
            long long costq=n%m;
            if(costp<1){
                if(p*n>q)cout<<q<<endl;
                else cout<<p*n<<endl;
            }
            else{
                long long cost=costp*q;
                if(costq*p>q)cout<<cost+q<<endl;
                else cout<<costq*p+cost<<endl;
            }
        }
    }
    return 0;
}

1002题;

题意:给你一个字符串ss=“anniversary”,输入一个s,从s中取三段,看看三段串起来是否可以构成ss

方法:把ss分成三段,在s中查找即可

#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
#define INF 999999999
using namespace std;
string s;
int findstr(string s1,string s2,string s3)
{
    string ss=s;
    int n=ss.find(s1,0);
    if(n!=string::npos){
        int nn=ss.find(s2,n+s1.size());
        if(nn!=string::npos){
            if(ss.find(s3,nn+s2.size())!=string::npos){
                cout<<"YES"<<endl;
                return 1;
            }
        }
    }

    return 0;
}
int main()
{
    int T;

    string s0="anniversary";
    cin>>T;
    while(T--){
        cin>>s;
        int n0=s0.size();
        int flag=0;
        for(int i=1;i<s0.size()-2;i++){
            string s1=s0.substr(0,i);
            for(int j=1;j<s0.size()-i;j++){
                string s2=s0.substr(i,j);
                string s3=s0.substr(i+j,n0-i-j);
                flag=findstr(s1,s2,s3);
                if(flag)break;
              //cout<<s1<<' '<<s2<<' '<<s3<<' '<<endl;
            }
            if(flag)break;
        }
        if(flag==0)
        flag=findstr("anniversa","r","y"); //因为我上面用的分解s0的方法缺了这个情况,导致WA一次
        if(flag==0)cout<<"NO"<<endl;
}
return 0;
}
1003:

题意:求一个数m,看看他是否能用最少的3*n*(n-1)+1表示出来,我实在看不出有什么规律,开始是用的暴力破解,果然超时~~~~~~~

WA代码:

#include<queue>
#include<stack>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
    LL a[20005];
    for(int i=1;i<20001;i++)
        a[i]=3*i*(i-1)+1;
    LL m;
   int T;
   cin>>T;
   while(T--)
   {
       cin>>m;
       int i,flag=0;
       LL minn=1000000006;
       for( i=20000;a[i]>m;i--);
       for(int j=i;j>0;j--){
        int mm=m;
       while(mm){
           if(mm-a[j]<0)j--;
            else {mm-=a[j];flag++;}
       }
       if(minn>flag)minn=flag;
     j=--i;
   }
    cout<<minn<<endl;
   }
   return 0;
}
题解说是有规律,附上链接:

点击打开链接

AC代码是:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值