#includeusing namespace std; void BubbleSort(int arr[], int n); int main() { int a[100]; int n; //下面两行是用来设置魔法石编号以及上面的数字 cin >> n; for (int i = 0; i < n;i++) cin >> a[i]; //使用冒泡排序 BubbleSort(a, n); //思想是在于,首先从头开始,选择一个魔法石,之后开始对后面的魔法石遍历, //如果相差只有1或者相等就通过将数组移位来删除较小的元素 //之后统计数组里面的元素个数来确定是否吸收只剩一块 //按照正常情况,最后剩下的魔法石的数字应该是最大的数字如果能只剩一块的话,或者是数字间隔大于一的几个数 //最后再判断数组的元素个数,为一的话就是成功 there : for (int i = 0; i < n;i++) { for (int j = i + 1; j < n;j++) { if ((a[i] - a[j]) == 1) { for (int k = j; k < n;k++) { a[k] = a[k + 1]; } n--; goto there; } else if ((a[i]-a[j]==-1)||(a[i]-a[j])==0) { for (int k = i; k < n;k++) { a[k] = a[k + 1]; } n--; i--; goto there; } //break; } } if (n == 1) cout << "YES"; else cout << "NO"; return 0; } //由于算法问题吧,只要输入的数字顺序为3,1,2的时候,那么2就会被2消掉,导致最后留下了3,1. //为了解决这一问题,首先将数组排序后,就不会出现这种问题,这里用到的是冒泡排序 void BubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
大魔法师ShacozzZ有n块魔法石,每一块魔法石上有一个数字,第i块魔法石上的数字是a[i],ShacozzZ想把魔法石里的魔力吸收,但是要吸收魔力需要满足以下条件:
1.任选两块魔法石,他们分别是第i块和第j块
2.这两块魔法石上面的数字是相近的或者相等的,即:|a[i]-a[j]|<=1
3.如果满足1,2两个条件,那么ShacozzZ就可以吸收掉其中数字较小的那一块,如果两个魔法石的数字相等,则可以吸收任意一块
那么现在问题来了,ShacozzZ是否能把他的魔法石吸收到只剩一块呢?
这上面是完整的题目
啊……我是小白一枚,这是我学校的OJ上面的一道题目,当时也是一路艰辛,算法不是很好,但是,能运行就好了吧(至少我现在还处于这水平吧,,,)


![大魔法师ShacozzZ有n块魔法石,每一块魔法石上有一个数字,第i块魔法石上的数字是a[i],ShacozzZ想把魔法石里的魔力吸收,但是要吸收魔力需要满足以下条件:1.任选两块魔法石,他们分别是 大魔法师ShacozzZ有n块魔法石,每一块魔法石上有一个数字,第i块魔法石上的数字是a[i],ShacozzZ想把魔法石里的魔力吸收,但是要吸收魔力需要满足以下条件:1.任选两块魔法石,他们分别是](http://www.mshxw.com/aiimages/31/297316.png)
