第一题,入门,考了快速幂算法,温故而知新~~
代码如下:
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;
}