题目:
考察点:
数学、模拟
侃侃:
其实是一道水题,但是比较菜的我最后差了一点,总之还是能力不行,没有AC,最后依靠模拟实现 AC。
因为这道题的数据量不大,最多 10^6,所以模拟是完全可以过的。
不过总算还是学到了一点知识,当用循环去解决问题时,看是否可以转化成一个式子进行解决。
这点非常重要。
模拟代码:
#include
#include
#include
#include
#include
using namespace std;
int t;
int h,a,H,A;
int main(void) {
scanf("%d",&t);
while(t --) {
int ans = 0;
scanf("%d%d%d%d",&h,&a,&H,&A);
if(A <= 0 && a != 0) {
puts("-1");
continue;
}
if(a <= 0) {
puts("0");
continue;
}
if(a >= H) {
printf("%d\n",-1);
continue;
}
if(h <= A && a < H) {
puts("0");
continue;
}
while(h > 0) {
int value = H;
while(value > 0) {
value -= a;
if(value <= 0) break;
h -= A;
if(h <= 0) break;
}
if(h > 0) ans ++;
else break;
}
printf("%d\n",ans);
}
数学式子 代码:
#include
#include
#include
#include
#include
using namespace std;
int t;
int h,a,H,A;
int main(void) {
scanf("%d",&t);
while(t --) {
int ans = 0;
scanf("%d%d%d%d",&h,&a,&H,&A);
if(A <= 0 && a != 0) {
puts("-1");
continue;
}
if(a <= 0) {
puts("0");
continue;
}
if(a >= H) {
printf("%d\n",-1);
continue;
}
if(h <= A && a < H) {
puts("0");
continue;
}
int res = H % a;
if(res == 0) {
int cnt = H / a;
int flood = (cnt - 1) * A;
// 这里我竟然傻傻的去用循环,还没搞对,至少要留一滴血,不然自己就死了,还如何战斗
ans = (h - 1) / flood;
} else {
int cnt = H / a + 1;
int flood = (cnt - 1) * A;
ans = (h - 1) / flood;
}
printf("%d\n",ans);
}
return 0;
}
用循环可以这样写:
#include
#include
#include
#include
#include
using namespace std;
int t;
int h,a,H,A;
int main(void) {
scanf("%d",&t);
while(t --) {
int ans = 0;
scanf("%d%d%d%d",&h,&a,&H,&A);
if(A <= 0 && a != 0) {
puts("-1");
continue;
}
if(a >= H) {
puts("-1");
continue;
}
int res = H % a;
if(res == 0) {
int cnt = H / a;
int flood = (cnt - 1) * A;
while(h > 1) {
h -= flood;
if(h <= 0) break;
ans ++;
}
} else {
int cnt = H / a + 1;
int flood = (cnt - 1) * A;
while(h > 1) {
h -= flood;
if(h <= 0) break;
ans ++;
}
}
printf("%d\n",ans);
}
return 0;
}
后记:
学会去勇敢的面对你所畏惧的一切,当你选择面对时,那时的你一定很棒。