~~~题面~~~

题解:

  可以发现,每走完一圈付的钱和买的数量是有周期性的,即如果没有因为缺钱而买不起某家店的东西,那么这一圈的所以决策将会和上一圈相同,这个应该是很好理解的,想想就好了。

  因为钱数固定时,决策固定,所以每次都O(n)扫一遍看当前情况下走一圈会花多少钱。

  然后直接一直取这么多钱,直到钱不够为止,再进行下一次计算走一圈的钱数,显然用类似取模的东西可以解决。

  为什么这样的复杂度是正确的呢?

  一开始觉得是$n^2$的,还想了半天如何优化,但其实因为每次钱数都取了模,而一个数每次取模至少会减少一半,所以其实只会进行log次,所以复杂度是$nlogn$的

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 230000
#define LL long long int n, top;
LL ans, t, minn = 10000000000000000LL;
LL s[AC]; inline LL read()
{
LL x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline void upmin(LL &a, LL b){
if(b < a) a = b;
} void pre()
{
n = read(), t = read();
for(R i = ; i <= n; i ++)
s[i] = read(), upmin(minn, s[i]);
} void work()
{
while(t >= minn)
{
LL tmp = t, rnt = ;
for(R i = ; i <= n; i ++)
if(tmp >= s[i]) tmp -= s[i], ++ rnt;
tmp = t - tmp;//获得实际消耗的钱
LL k = t / tmp;
ans += k * rnt;
t -= k * tmp;
}
cout << ans << endl;
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return ;
}

最新文章

  1. SQLSERVER如何查看索引缺失
  2. MySQL的高可用设计方案的记录
  3. 试一下SVG
  4. getattr的作用是什么呢
  5. ST_SRID
  6. makefile实例(2)-多个文件实例
  7. OA学习笔记-002-Sruts2.1配置
  8. BAE、SAE 与 GAE 对比
  9. 最近调试HEVC中码率控制, 发现HM里面一个重大bug
  10. Apache的htaccess文件出现500错误的原因
  11. Integer陷阱(0~127和其他 数值相等对象比较)
  12. (hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数&amp;lt;=3,输出剩下的人 )
  13. Spring AOP异常捕获原理
  14. 关于Android使用SFTP上传文件报错问题
  15. java 多态 向上 向下转型
  16. egret编译 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed process out of memory解决
  17. git学习笔记:常用命令总结
  18. C#学习-const和readonly
  19. appium环境搭建及项目实战
  20. 2.1TF模型持久化

热门文章

  1. redis 学习笔记二
  2. MySql 增加字段 删除字段 修改字段名称 修改字段类型
  3. 两个有序数组合并成一个有序数组(要求时间复杂度为O(n))
  4. c和c++的强制类型转换
  5. html简约风用户登录界面网页制作html5-css-jquary-学习模版
  6. Python3 Tkinter-Listbox
  7. [leetcode-738-Monotone Increasing Digits]
  8. mysql 启动报错
  9. POJ 2229 计数DP
  10. Mybatis实现