求解此题
本帖最后由 香蕉那个不拿拿 于 2023-8-1 19:21 编辑https://xjoi.net/problem/1176 进不去,显示一个彩虹猫 稍等片刻,快马加鞭解题中。。。 你还是把题目放出来吧,我们可能因为级别不够看不了 歌者文明清理员 发表于 2023-8-1 19:05
已放出 Mike_python小 发表于 2023-8-1 19:06
进不去,显示一个彩虹猫
已放出 isdkz 发表于 2023-8-1 19:06
稍等片刻,快马加鞭解题中。。。
已放出 香蕉那个不拿拿 发表于 2023-8-1 19:23
已放出
复制成文本给我OK? 题目要求判断在一张长为a,宽为b的纸上放圆形片的游戏中,先手放纸片的人是否一定能赢。已放好的纸片不能挪动位置,且新放的纸片不能相交但可以外切已放纸片的边界,如果新放不了纸片则算输。
思路:
根据游戏规则,我们可以观察到以下几个情况:
如果r >= min(a, b)/2,即圆形片的半径大于等于纸的最小边长的一半,那么无论先手怎么放纸片,后手都可以把剩下的空间填满,因此先手必输。
如果r * sqrt(2) > min(a, b),即圆形片的直径大于纸的最小边长,那么新放的纸片一定无法外切已放纸片的边界,因此无法进行有效放置,先手必输。
对于其他情况,先手可以先放一个圆心位于纸的中心,半径为r的圆形片。这个圆形片的直径小于等于纸的最小边长,后手无法放置圆形片。接下来,无论后手怎么放纸片,先手总可以对称地放置一个与后手放置的圆形片相对应的圆形片,保持对称,并且不会相交,直到纸的所有空间都被填满。因此,先手必胜。
根据上述分析,可以得出结论:如果满足条件2或者条件3,则先手必胜;否则,先手必输。
以下是相应的C++代码实现:
#include <iostream>
#include <cmath>
using namespace std;
string whoWins(int a, int b, int r) {
int minSide = min(a, b);
double minDiameter = r * sqrt(2);
if (r >= minSide / 2)
return "Bob win";
else if (minDiameter > minSide)
return "Bob win";
else
return "Alice win";
}
int main() {
int a, b, r;
cin >> a >> b >> r;
string result = whoWins(a, b, r);
cout << result << endl;
return 0;
}
以上代码中,我们定义了一个whoWins函数来判断先手是否能赢得游戏。在main函数中,我们读取输入的a、b、r值,并调用whoWins函数进行判断,最后输出结果。
注意:在输入时,要确保纸的长度a和宽度b大于0,半径r大于等于0。考虑边界情况和非法输入超出范围的情况。 学习编程中的Ben 发表于 2023-8-1 19:50
题目要求判断在一张长为a,宽为b的纸上放圆形片的游戏中,先手放纸片的人是否一定能赢。已放好的纸片不能挪 ...
香蕉那个不拿拿 发表于 2023-8-1 19:53
em 本帖最后由 香蕉那个不拿拿 于 2023-8-1 20:01 编辑
本帖最后由 香蕉那个不拿拿 于 2023-8-1 20:00 编辑
学习编程中的Ben 发表于 2023-8-1 19:54
em
python还是c++? 学习编程中的Ben 发表于 2023-8-1 19:55
python还是c++?
c++ 香蕉那个不拿拿 发表于 2023-8-1 19:55
此代码可AC
额,看私聊 #include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,r;
cin >>a>>b>>r;
if(a<2*r||b<2*r){
cout <<"Bob win";
}
else cout<<"Alice win";
return 0;
}
页:
[1]