9.2 刷题

第一题,入门,考了快速幂算法,温故而知新~~

代码如下:

a, n = map(int,input().split())
r=1
while n != 0:
    if n%2 == 1:
        r = r*a
        if r>1000000000:
            print("-1")
            break
    a = a*a#指数按照二进制的原则翻倍
    n = n//2#去掉n的二进制的最后一位
if n == 0:
    print(r)



第二题,坐公交,普及-,看得出来是考队列的,所以不用python写了,换到c++。

本来以为会是一道简单题,结果用queue时empty()的方法用错了两次,导致答案总是不对。而且没考虑到手上优惠券很多的情况,也就是说这题用队列其实并不是很合适(因为队列难以实现查找以及中间部位的删除)。

#include<bits/stdc++.h>
using namespace std;
#define  ll long long
typedef struct  info{
    ll money;
    ll time0;
}info;
queue<info> q;
info temp;
ll tran;
ll n;
ll sum;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>tran>>temp.money>>temp.time0;
        if(tran==0)
        {
            sum+=temp.money;
            q.push(temp);
        }
        else
        {
            while(!q.empty()&&(temp.time0-q.front().time0>45))//删除时间上不符合的
            {
                q.pop();
            }
            while()//当手上优惠票很多时,查找money上复合的
        }
    }
    cout<<sum;
}

所以最后选择用链表list

改了蛮久的,主要最后卡在了一个细小的问题上(因为使用过了一张合适的优惠票导致表示手头优惠票的list指向了l.end())

代码如下~~(普及-敲了好久 变菜了)

#include<bits/stdc++.h>
using namespace std;
#define  ll long long
typedef struct  info{
    ll money;
    ll time0;
}info;
list<info> l;
info temp;
ll tran;
ll n;
ll sum;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>tran>>temp.money>>temp.time0;
        if(tran==0)
        {
            sum+=temp.money;
            l.push_back(temp);
        }
        else
        {
            while(!l.empty()&&(temp.time0-l.front().time0>45))//删除时间上不符合的
                l.pop_front();
            auto it=l.begin();
            int flag=0;
            while(it!=l.end())//当手上优惠票很多时,查找money上符合要求的元素
            {
                if((*it).money>=temp.money)
                {
                    it=l.erase(it);
                    flag=1;
                    break;
                }
                else
                    ++it;
            }
            if(it==l.end()&&flag==0)//没有合适的优惠票或者优惠票用完了并且没有使用过优惠票(防止因为使用过优惠票导致it指向列表尾部)
            {
                sum+=temp.money;
            }
        }
    }
    cout<<sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值