题目描述
样例
样例输入1
290
230
280
200
300
170
340
50
90
80
200
60
样例输出1
-7
样例输入2
290
230
280
200
300
170
330
50
90
80
200
60
样例输出2
1580
样例输入3
288
93
278
51
110
189
331
50
277
57
186
64
样例输出3
1946
样例输入4
288
110
310
188
168
161
32
332
89
298
201
60
样例输出4
-3
样例输入5
288
225
151
95
279
203
65
300
266
232
199
60
样例输出5
1477
样例输入6
288
339
342
2
39
245
99
269
92
167
198
61
样例输出6
-2
样例输入7
288
219
24
166
259
329
165
207
95
35
194
62
样例输出7
1857
样例输入8
288
334
214
73
19
21
198
175
271
320
193
62
样例输出8
-2
样例输入9
288
99
55
330
129
63
232
144
97
254
191
63
样例输出9
1975
样例输入10
288
213
246
237
240
105
265
113
274
188
190
63
样例输出10
1398
算法1
(暴力枚举) $O(12)$
yxc大佬讲过,这里简单做一下优化。
首先,问大家一个问题,男人的浪漫是什么?
没错,速度快才是男人的浪漫!
所以,我们要使用一些花里胡哨的操作。
比如:把四则运算改成位运算啊,把cin、cout改成scanf、printf||自己写个快速读入、快速输出(这个方法不适用于这道题,读入速度堪比龟速)
当然,这些都不重要,最重要的是减少循环或重复计算的点,比如本题当津津的钱不够用了,正常的写法一定是最后结算时输出第几天没钱了;但是为了追求快,我们可以在钱不够用的时候直接输出天数并且结束程序,这样就可以跳过很多循环。
另外,%运算是很浪费时间的,根据题意,我们完全可以用n/x×x代替 n%x ,再用位运算优化一下 n×x
这道题用乘法的地方无非就是m×120和m×100,分别用位运算表示为(m<<7)-(m<<3)和(m<<6)+(m<<5)+(m<<2),什么?你问除法为什么不优化?我太菜了,哪个大佬会优化的可以在评论区留言!
不会吧?不会吧?不会真有人不知道位运算吧!
给你们个链接
二进制的计算方式对于计算机是最直接的计算,所以通常使用位运算要优于+-*/%
时间复杂度 $O(12)$
中间有亿点点细节,所以这个时间复杂度仅仅是大概
参考文献
C++ 代码
#include<bits/stdc++.h>
using namespace std;//这个可以删掉,因为我的代码里用的scanf和printf
// inline int qr()
// {
// int x=0,m=0;
// char ch=getchar();
// while(ch<'0'||ch>'9') m|=ch=='-',ch=getchar();
// while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
// return m?-x:x;
// }
//龟速读入,并不是用于此题
int main()
{
int sum=0,cun=0;//sum表示总钱数,cun表示存的钱
for(int i=1;i<=12;i++)//十二个月
{
int x;//每个月的预算
//x=qr();//可怜的龟速读入
scanf("%d",&x);
sum+=300;//妈妈每个月给津津三百
sum-=x;//津津的预算扣除
if(sum<0)
{
printf("-%d",i);
return 0;
} //当这个月钱不够时,直接输出,然后结束,这波,这波叫德国闪击波兰
if(sum>=100)
{
cun+=((sum/100<<7)-(sum/100<<3));//相当于cun-=cun/100*120;即cun-=cun%100*1.2; 1.2是利息
sum-=((sum/100<<6)+(sum/100<<5)+(sum/100<<2));//相当于sum-=sum/100*100;即sum-=sum%100;
}
}
printf("%d",sum+cun); //输出最后剩的钱和存的钱
return 0;//考试一定要加
}
算法2
(打表过样例,暴力出奇迹) $O(10)$
管你看没看懂,看就完了
时间复杂度 $O(10)$
参考文献
C++ 代码
#include<bits/stdc++.h>
int a,b,c,d,e,f,g;
int main()
{
scanf("%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g);
if(a==290)
{
if(g==340) puts("-7");
else puts("1580");
}
else if(a==288)
{
if(b==93) puts("1946");
else if(b==110) puts("-3");
else if(b==225) puts("1477");
else if(b==339||b==334) puts("-2");
else if(b==219) puts("1857");
else if(b==99) puts("1975");
else puts("1398");
}
return 0;
}
${\color{Yellow} {??????????}}$
带黄看黄
$\color{DodgerBlue}{啥}$ $\color{cyan}{tql}$ $\color{cyan}{tql}$ $\color{#FAF07F}{大佬说话怎么带的颜色啊}$
干好事!
ghs?
ghs?