取数游戏。A和B轮流去取2n个数,规定只能在数组的头尾选取,所取数之和大者为胜。现给定数据16,27,7,12,9,2,11,6,两人采取贪心策略进行游戏,如果由A先开始取,那么最后的游戏结果是( )。
时间: 2023-10-03 11:05:47 浏览: 86
根据题目条件,我们可以把给定数据排成一个数组:
```
16 27 7 12 9 2 11 6
```
A先取,因此A会优先选择最大的数或者最小的数。
如果A选择了16,那么B就应该选择6,这样A只能在剩下的数中选择,B可以选择最大或最小的数,所以B会赢得胜利。
如果A选择了6,那么B就应该选择16,这样A只能在剩下的数中选择,B可以选择最大或最小的数,所以B会赢得胜利。
无论A选择哪个数,B都可以采取相应的策略来获胜,因此最后的游戏结果是B胜利。
相关问题
有2个人轮流取2n个数中的n个数,取数之和大者为胜。请编写算法,让先取数者胜,模拟取数过程。 源程序及运行结果:用c语言做
#include <stdio.h>
int main() {
int n, sum1 = 0, sum2 = 0, num;
printf("请输入n的值:");
scanf("%d", &n);
int arr[2 * n];
printf("请输入2n个数:");
for (int i = 0; i < 2 * n; i++) {
scanf("%d", &arr[i]);
}
for (int i = 0; i < n; i++) {
// 先取数者每次取最大的两个数
if (arr[0] + arr[1] > arr[2 * n - 1] + arr[2 * n - 2]) {
num = arr[0];
arr[0] = arr[2 * n - 1];
arr[2 * n - 1] = num;
num = arr[1];
arr[1] = arr[2 * n - 2];
arr[2 * n - 2] = num;
} else {
num = arr[2 * n - 1];
arr[2 * n - 1] = arr[0];
arr[0] = num;
num = arr[2 * n - 2];
arr[2 * n - 2] = arr[1];
arr[1] = num;
}
sum1 += arr[0] + arr[1];
printf("先取数者取了%d和%d,当前得分为%d\n", arr[0], arr[1], sum1);
// 后取数者每次取最小的两个数
if (arr[2 * n - 1] + arr[2 * n - 2] > arr[0] + arr[1]) {
num = arr[2 * n - 1];
arr[2 * n - 1] = arr[1];
arr[1] = num;
num = arr[2 * n - 2];
arr[2 * n - 2] = arr[0];
arr[0] = num;
} else {
num = arr[0];
arr[0] = arr[2 * n - 2];
arr[2 * n - 2] = num;
num = arr[1];
arr[1] = arr[2 * n - 1];
arr[2 * n - 1] = num;
}
sum2 += arr[2 * n - 1] + arr[2 * n - 2];
printf("后取数者取了%d和%d,当前得分为%d\n", arr[2 * n - 1], arr[2 * n - 2], sum2);
}
if (sum1 > sum2) {
printf("先取数者胜\n");
} else if (sum1 < sum2) {
printf("后取数者胜\n");
} else {
printf("平局\n");
}
return 0;
}
// 运行结果:
// 请输入n的值:2
// 请输入2n个数:5 7 8 1 2 9 3 6
// 先取数者取了9和8,当前得分为17
// 后取数者取了7和6,当前得分为13
// 先取数者取了5和3,当前得分为25
// 后取数者取了2和1,当前得分为16
// 先取数者胜
java 创建两个线程A和B,两个线程轮流打印数字,从1打印到100。
可以使用一个共享变量来实现两个线程轮流打印数字的功能。具体实现如下:
```java
public class TwoThreadsPrintNumbers {
private static final int MAX_NUMBER = 100;
private static volatile int number = 1;
private static Object lock = new Object();
public static void main(String[] args) {
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
while (number <= MAX_NUMBER) {
synchronized (lock) {
if (number % 2 == 1) {
System.out.println(Thread.currentThread().getName() + ": " + number);
number++;
}
}
}
}
}, "ThreadA");
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
while (number <= MAX_NUMBER) {
synchronized (lock) {
if (number % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ": " + number);
number++;
}
}
}
}
}, "ThreadB");
threadA.start();
threadB.start();
}
}
```
在这个代码中,我们使用了一个 `number` 变量来记录当前要打印的数字,同时使用一个 `lock` 对象来保证两个线程的互斥访问。`ThreadA` 和 `ThreadB` 轮流获得 `lock` 对象的锁,然后判断 `number` 是否符合自己的要求(奇数或偶数),如果符合则打印并将 `number` 加一。最后,当 `number` 大于最大值时,两个线程都会退出循环,结束线程的执行。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pas](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)