[关闭]
@ZSCDumin 2018-12-14T10:26:21.000000Z 字数 15404 阅读 560

CCF计算机软件能力认证试题

c++


出现次数最多的数

  1. #include <iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int main() {
  5. int num[10001] = { 0 };
  6. int n;
  7. cin >> n;
  8. for (int i = 0; i < n; i++)
  9. {
  10. int t;
  11. cin >> t;
  12. num[t] ++;
  13. }
  14. int max = 0, index = 0;
  15. for (int i = 10000; i >= 0; i--)
  16. {
  17. if (num[i] >= max){
  18. max = num[i];
  19. index = i;
  20. }
  21. }
  22. cout << index << endl;
  23. return 0;
  24. }

ISBN号码

  1. #include <iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main() {
  5. char s[20];
  6. int num[20] = { 0 };
  7. int index = 0;
  8. cin >> s;
  9. int len = strlen(s);
  10. for (int i = 0; i < len; i++){
  11. if (s[i] == '-'){
  12. continue;
  13. }
  14. else{
  15. num[index++] = s[i] - '0';
  16. }
  17. }
  18. int sum = 0;
  19. for (int i = 0; i < index - 1; i++){
  20. sum += num[i] * (i + 1);
  21. }
  22. sum = sum % 11;
  23. if (sum == 10 && s[len - 1] == 'X' || sum == num[index - 1]){
  24. cout << "Right" << endl;
  25. }
  26. else{
  27. if (sum == 10)
  28. s[len - 1] = 'X';
  29. else
  30. s[len - 1] = sum + '0';
  31. cout << s << endl;
  32. }
  33. return 0;
  34. }

跳一跳

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. int num[31];
  5. int t,index=0;
  6. while(1) {
  7. cin >> t;
  8. num[index++]=t;
  9. if(t==0) {
  10. break;
  11. }
  12. }
  13. int sum=0;
  14. int count =1;
  15. for(int i=0; i<index; i++) {
  16. if(num[i]==1) {
  17. sum+=1;
  18. count=1;
  19. } else if(num[i]==2) {
  20. sum+=count*2;
  21. count ++;
  22. } else {
  23. break;
  24. }
  25. }
  26. cout<<sum <<endl;
  27. return 0;
  28. }

碰撞的小球

  1. #include <iostream>
  2. using namespace std;
  3. int num[105];
  4. int main() {
  5. int dire[105];
  6. int n, L, t;
  7. cin >> n >> L >> t;
  8. for (int i = 0; i < n; i++) {
  9. cin >> num[i];
  10. dire[i] = 1;
  11. }
  12. for (int i = 1; i <= t; i++) { //计时器
  13. for (int j = 0; j < n; j++) {
  14. //判断方向
  15. if (num[j] == L && dire[j] == 1 || num[j] == 0 && dire[j] == -1){
  16. dire[j] *= -1;
  17. }
  18. else {
  19. for (int k = 0; k < n; k++){
  20. if (num[k] == num[j] && k != j){
  21. dire[j] *= -1;
  22. dire[k] *= -1;
  23. }
  24. }
  25. }
  26. //移动
  27. num[j] += dire[j];
  28. }
  29. }
  30. for (int j = 0; j < n; j++) {//输出结果
  31. if (j == n - 1)
  32. cout << num[j] << endl;
  33. else
  34. cout << num[j] << " ";
  35. }
  36. return 0;
  37. }

最小差值

  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. using namespace std;
  5. int num[1005];
  6. int main() {
  7. int n;
  8. cin >> n;
  9. for (int i = 0; i < n; i++){
  10. cin >> num[i];
  11. }
  12. sort(num, num + n);
  13. int min = 99999;
  14. for (int i = 0; i < n - 1; i++){
  15. if (num[i] == num[i + 1]){
  16. min = 0;
  17. break;
  18. }
  19. if (min > abs(num[i] - num[i + 1]))
  20. {
  21. min = abs(num[i] - num[i + 1]);
  22. }
  23. }
  24. cout << min << endl;
  25. return 0;
  26. }

游戏

  1. #include <iostream>
  2. #include <cmath>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6. int num[1005];
  7. int main() {
  8. int N, K, num = 1;
  9. queue<int> list;
  10. cin >> N >> K;
  11. for (int i = 1; i <= N; i++){
  12. list.push(i);
  13. }
  14. while (list.size() > 1){
  15. int top = list.front(); //取第一个元素
  16. list.pop(); //删除第一个元素
  17. if (num % K != 0 && (num % 10) != K){
  18. list.push(top);
  19. }
  20. num++;
  21. }
  22. cout << list.front();
  23. return 0;
  24. }

版本二(有点瑕疵,样例: 3 1通不过)

  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. using namespace std;
  5. int num[1005];
  6. int main() {
  7. int n, k;
  8. cin >> n >> k;
  9. int resNum = n;
  10. for (int i = 0; i < n; i++){
  11. num[i] = i + 1;
  12. }
  13. int count = 0;
  14. while (resNum > 1){
  15. for (int i = 0; i < n; i++){
  16. if (num[i] != -1){
  17. count++;
  18. if (count % k == 0 || count % 10 == k)
  19. {
  20. resNum--;
  21. num[i] = -1;
  22. }
  23. }
  24. }
  25. }
  26. for (int i = 0; i < n; i++){
  27. if (num[i] != -1){
  28. cout << num[i];
  29. break;
  30. }
  31. }
  32. return 0;
  33. }

修订版

  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. using namespace std;
  5. int num[1005];
  6. int main() {
  7. int n, k;
  8. cin >> n >> k;
  9. int resNum = n;
  10. for (int i = 0; i < n; i++){
  11. num[i] = i + 1;
  12. }
  13. int count = 0;
  14. for (int i = 0;; i++){
  15. if (resNum <= 1){
  16. break;
  17. }
  18. if (num[i%n] != -1){
  19. count++;
  20. if (count % k == 0 || count % 10 == k)
  21. {
  22. resNum--;
  23. num[i%n] = -1;
  24. }
  25. }
  26. }
  27. for (int i = 0; i < n; i++){
  28. if (num[i] != -1){
  29. cout << num[i];
  30. break;
  31. }
  32. }
  33. return 0;
  34. }

分蛋糕

  1. #include <iostream>
  2. #include <cmath>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6. int num[1005];
  7. int main() {
  8. int n, k;
  9. int count = 0;
  10. cin >> n >> k;
  11. for (int i = 0; i < n; i++){
  12. cin >> num[i];
  13. }
  14. int sum = 0;
  15. for (int i = 0; i < n; i++){
  16. if (i == n - 1 && sum + num[i] < k){
  17. count++;
  18. }
  19. else
  20. {
  21. sum += num[i];
  22. if (sum >= k){
  23. count++;
  24. sum = 0;
  25. }
  26. }
  27. }
  28. cout << count << endl;
  29. return 0;
  30. }

中间数

  1. #include <iostream>
  2. #include <cmath>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6. int num[1005];
  7. int main() {
  8. int n;
  9. int flag = 0;
  10. cin >> n;
  11. for (int i = 0; i < n; i++){
  12. cin >> num[i];
  13. }
  14. for (int i = 0; i < n; i++){
  15. int re1 = 0, re2 = 0;
  16. for (int j = 0; j < n; j++){
  17. if (i != j){
  18. if (num[i] < num[j])
  19. re1++;
  20. if (num[i] > num[j])
  21. re2++;
  22. }
  23. }
  24. if (re1 == re2)
  25. {
  26. flag = 1;
  27. cout << num[i] << endl;
  28. break;
  29. }
  30. }
  31. if (flag == 0)
  32. cout << "-1" << endl;
  33. return 0;
  34. }

最大波动

  1. #include <iostream>
  2. #include <cmath>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6. int num[1005];
  7. int main() {
  8. int n;
  9. int flag = 0;
  10. cin >> n;
  11. for (int i = 0; i < n; i++){
  12. cin >> num[i];
  13. }
  14. int max = -1;
  15. for (int i = 0; i < n-1; i++){
  16. if (max < abs(num[i] - num[i + 1])){
  17. max = abs(num[i] - num[i + 1]);
  18. }
  19. }
  20. cout << max << endl;
  21. return 0;
  22. }

折点计算

  1. #include <iostream>
  2. #include <cmath>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6. int num[1005];
  7. int main() {
  8. int n;
  9. cin >> n;
  10. for (int i = 0; i < n; i++){
  11. cin >> num[i];
  12. }
  13. int count = 0;
  14. int before = num[0] > num[1] ? 0 : 1;
  15. int after = 0;
  16. for (int i = 1; i < n - 1; i++){
  17. if (num[i] > num[i + 1]){
  18. after = 0;
  19. }
  20. else
  21. {
  22. after = 1;
  23. }
  24. if (before != after){
  25. count++;
  26. }
  27. before = after;
  28. }
  29. cout << count << endl;
  30. return 0;
  31. }

整数之和

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int main() {
  5. char n[30];
  6. cin >> n;
  7. int sum = 0;
  8. for (int i = 0; i < strlen(n); i++){
  9. sum += n[i] - '0';
  10. }
  11. cout << sum << endl;
  12. return 0;
  13. }

数列分段

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int num[1005];
  5. int main() {
  6. int n;
  7. cin >> n;
  8. for (int i = 0; i < n; i++){
  9. cin >> num[i];
  10. }
  11. int sum = 1;
  12. for (int i = 0; i < n-1; i++){
  13. if (num[i] != num[i + 1]){
  14. sum++;
  15. }
  16. }
  17. cout << sum << endl;
  18. return 0;
  19. }

图像旋转

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int num[1005][1005];
  5. int main() {
  6. int n, m;
  7. cin >> n >> m;
  8. for (int i = 0; i < n; i++){
  9. for (int j = 0; j < m; j++){
  10. cin >> num[i][j];
  11. }
  12. }
  13. int sum = 1;
  14. for (int i = 0; i < n - 1; i++){
  15. if (num[i] != num[i + 1]){
  16. sum++;
  17. }
  18. }
  19. for (int i = m - 1; i >= 0; i--){
  20. for (int j = 0; j < n; j++){
  21. cout << num[j][i] << " ";
  22. }
  23. cout << endl;
  24. }
  25. return 0;
  26. }

门禁系统

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int num[1005];
  5. int res[1005];
  6. int main() {
  7. int n;
  8. cin >> n;
  9. for (int i = 0; i < n; i++){
  10. cin >> num[i];
  11. res[i] = 1;
  12. }
  13. for (int i = 1; i < n; i++){
  14. for (int j = 0; j < i; j++){
  15. if (num[i] == num[j])
  16. res[i]++;
  17. }
  18. }
  19. for(int i = 0; i < n; i++){
  20. cout << res[i] << " ";
  21. }
  22. return 0;
  23. }

相邻数对

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. int num[1005];
  5. int main() {
  6. int n;
  7. cin >> n;
  8. for (int i = 0; i < n; i++){
  9. cin >> num[i];
  10. }
  11. int count = 0;
  12. for (int i = 0; i < n; i++){
  13. for (int j = 0; j < n; j++){
  14. if (i != j)
  15. {
  16. if (abs(num[i] - num[j]) == 1)
  17. {
  18. count++;
  19. }
  20. }
  21. }
  22. }
  23. cout << count / 2 << endl;
  24. return 0;
  25. }

相反数

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. int num[1005];
  5. int main() {
  6. int n;
  7. cin >> n;
  8. for (int i = 0; i < n; i++){
  9. cin >> num[i];
  10. }
  11. int count = 0;
  12. for (int i = 0; i < n; i++){
  13. for (int j = 0; j < n; j++){
  14. if (i != j)
  15. {
  16. if (num[i] + num[j] == 0)
  17. {
  18. count++;
  19. }
  20. }
  21. }
  22. }
  23. cout << count / 2 << endl;
  24. return 0;
  25. }

除法

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. long long tree[101024];
  5. int n, m, a[101024];
  6. int lowbit(int x)
  7. {
  8. return -x&x;
  9. }
  10. void update(int x, int v)
  11. {
  12. for (int i = x; i <= n; i += lowbit(i))
  13. tree[i] += v;
  14. }
  15. long long getsum(int x)
  16. {
  17. long long ans = 0;
  18. for (int i = x; i > 0; i -= lowbit(i))
  19. ans += tree[i];
  20. return ans;
  21. }
  22. int main()
  23. {
  24. int op, l, r;
  25. int v;
  26. cin >> n >> m;
  27. for (int i = 1; i <= n; ++i)
  28. {
  29. cin >> a[i];
  30. update(i, a[i]);
  31. }
  32. for (int i = 0; i < m; i++)
  33. {
  34. cin >> op;
  35. if (op == 1)
  36. {
  37. cin >> l >> r >> v;
  38. if (v == 1)
  39. continue;
  40. while (l <= r)
  41. {
  42. if (a[l] >= v&&a[l] % v == 0)
  43. {
  44. update(l, -(a[l] - a[l] / v));
  45. a[l] /= v;
  46. }
  47. ++l;
  48. }
  49. }
  50. else if (op == 2)
  51. {
  52. cin >> l >> r;
  53. cout << getsum(r) - getsum(l - 1) << endl;
  54. }
  55. }
  56. return 0;
  57. }

字符串匹配

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;
  5. string a[105];
  6. string str;
  7. int n, m;
  8. int main()
  9. {
  10. string::size_type idx;
  11. getline(cin, str);
  12. cin >> n;
  13. cin >> m;
  14. getchar();
  15. for (int i = 0; i < m; i++){
  16. getline(cin, a[i]);
  17. }
  18. if (n == 0){
  19. transform(str.begin(), str.end(), str.begin(), ::tolower);
  20. for (int i = 0; i < m; i++){
  21. string t = a[i];
  22. transform(a[i].begin(), a[i].end(), a[i].begin(), ::tolower);
  23. idx = a[i].find(str);
  24. if (idx != string::npos){
  25. cout << t << endl;
  26. }
  27. }
  28. }
  29. else
  30. {
  31. for (int i = 0; i < m; i++){
  32. idx = a[i].find(str);
  33. if (idx != string::npos){
  34. cout << a[i] << endl;
  35. }
  36. }
  37. }
  38. return 0;
  39. }

数字排序

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;
  5. int n;
  6. struct my{
  7. int num;
  8. int count;
  9. }nums[1005];
  10. int compare(my s1, my s2){
  11. if (s1.count == s2.count)
  12. return s1.num < s2.num;
  13. else
  14. return s1.count > s2.count;
  15. }
  16. int main()
  17. {
  18. int num[1005] = { 0 };
  19. cin >> n;
  20. for (int i = 0; i < n; i++){
  21. int t;
  22. cin >> t;
  23. num[t]++;
  24. }
  25. int k = 0;
  26. for (int i = 0; i < 1001; i++){
  27. if (num[i] >= 1){
  28. nums[k].num = i;
  29. nums[k].count = num[i];
  30. k++;
  31. }
  32. }
  33. sort(nums, nums + k, compare);
  34. for (int i = 0; i < k; i++){
  35. cout << nums[i].num << " " << nums[i].count << endl;
  36. }
  37. return 0;
  38. }

Z形扫描

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int n;
  5. int num[505][505];
  6. const int RIGHT = 1; //向右走
  7. const int DOWN = 2; //向下走
  8. const int LEFTDOWN = 3; //向做下走
  9. const int RIGHTUP = 4; //向右上走
  10. #define max 505
  11. string to_String(int n)
  12. {
  13. int m = n;
  14. int i = 0, j = 0;
  15. char s[max];
  16. char ss[max];
  17. while (m > 0)
  18. {
  19. s[i++] = m % 10 + '0';
  20. m /= 10;
  21. }
  22. s[i] = '\0';
  23. i = i - 1;
  24. while (i >= 0)
  25. {
  26. ss[j++] = s[i--];
  27. }
  28. ss[j] = '\0';
  29. return ss;
  30. }
  31. void run(){
  32. //从第一个位置开始,x为横坐标,y为纵坐标,注意x,y在二维数组中的位置
  33. int x = 0;
  34. int y = 0;
  35. //输出要求有空格隔开
  36. string result = to_String(num[y][x]) + " ";
  37. //方向变量的初始值
  38. int direction = 0;
  39. //下面就开始出发走咯
  40. while (!(x == n - 1 && y == n - 1)){//循环直至到达终点(最右下角的位置)
  41. //先判断下一步往哪个方向走
  42. if (direction == 0){ //为0说明还没走出第一步,所以接着应该往右边走一步
  43. direction = RIGHT;
  44. }
  45. else if (direction == RIGHT){ //上一次方向向右,下一步应该向左下或者右上
  46. if (x - 1 >= 0 && y + 1 < n){ //左下可走
  47. direction = LEFTDOWN;
  48. }
  49. else { //只能走右上了
  50. direction = RIGHTUP;
  51. }
  52. }
  53. else if (direction == DOWN){ //上一次方向向下,下一步应该向左下或者右上
  54. if (x - 1 >= 0 && y + 1 < n){ //左下可走
  55. direction = LEFTDOWN;
  56. }
  57. else { //只能走右上了
  58. direction = RIGHTUP;
  59. }
  60. }
  61. else if (direction == LEFTDOWN){ //上一次向左下,如果可以,下一步应该继续向左下,否则 向右或者向下走
  62. if (y + 1 < n && x - 1 >= 0){ //先判断能否继续向左下
  63. direction = LEFTDOWN;
  64. }
  65. else if (y + 1 < n){ //然后判断能否向下走
  66. direction = DOWN;
  67. }
  68. else { //最后只能向右走了
  69. direction = RIGHT;
  70. }
  71. }
  72. else if (direction == RIGHTUP){ //上一次向右上,如果可以,下一步应该继续向右上,否则向右或者下走
  73. if (x + 1 < n && y - 1 >= 0){ //先判断能否继续向右上
  74. direction = RIGHTUP;
  75. }
  76. else if (x + 1 < n){ //然后判断能否向右走
  77. direction = RIGHT;
  78. }
  79. else{ //最后只能向下走了
  80. direction = DOWN;
  81. }
  82. }
  83. //根据上面确定的方向来走出下一步
  84. switch (direction){
  85. case RIGHT: x = x + 1; break;
  86. case DOWN: y = y + 1; break;
  87. case LEFTDOWN: x = x - 1; y = y + 1; break;
  88. case RIGHTUP: x = x + 1; y = y - 1; break;
  89. }
  90. //读取当前走到位置的数字.注意x和y的位置
  91. result += to_String(num[y][x]) + " ";
  92. }
  93. cout << result << endl;
  94. }
  95. int main()
  96. {
  97. cin >> n;
  98. for (int i = 0; i < n; i++){
  99. for (int j = 0; j < n; j++){
  100. cin >> num[i][j];
  101. }
  102. }
  103. run();
  104. return 0;
  105. }

日期计算

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int n, m;
  5. int month1[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  6. int month2[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  7. bool isLeapYear(int year){
  8. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
  9. return true;
  10. }
  11. else{
  12. return false;
  13. }
  14. }
  15. void printMonthAndDay(int flag, int m){
  16. int days = m;
  17. int month = 1;
  18. int day = 0;
  19. int i = 0;
  20. if (flag == 0){
  21. while (days - month1[i] > 0)
  22. {
  23. days -= month1[i++];
  24. month++;
  25. }
  26. cout << month << "\n" << days << endl;
  27. }
  28. else{
  29. while (days - month2[i] > 0)
  30. {
  31. days -= month2[i++];
  32. month++;
  33. }
  34. cout << month << "\n" << days << endl;
  35. }
  36. }
  37. int main()
  38. {
  39. cin >> n >> m;
  40. int flag = isLeapYear(n);
  41. printMonthAndDay(flag, m);
  42. return 0;
  43. }

火车票

  1. #include <iostream>
  2. using namespace std;
  3. int n;
  4. int num[105];
  5. int seat[20][5];
  6. int main()
  7. {
  8. cin >> n;
  9. for (int i = 0; i < n; i++)
  10. {
  11. cin >> num[i];
  12. }
  13. for (int i = 0; i < n; i++){
  14. int res = num[i];
  15. int t[100];
  16. int flag = 0;
  17. for (int j = 0; j < 20; j++){
  18. int count = 0;
  19. int backup[20][5] = { 0 };
  20. for (int k = 0; k < 5; k++){
  21. if (seat[j][k] == 0){
  22. backup[j][k] = 1;
  23. t[count++] = j * 5 + k + 1;
  24. for (int l = 1; l < res; l++){
  25. k++;
  26. if (seat[j][k] == 1 || k >= 5 || count >= res)
  27. {
  28. break;
  29. }
  30. else
  31. {
  32. t[count++] = j * 5 + k + 1;
  33. backup[j][k] = 1;
  34. }
  35. }
  36. if (count == res){ //座位够分
  37. for (int s = 0; s < count; s++){
  38. cout << t[s] << " ";
  39. }
  40. cout << endl;
  41. for (int x = 0; x < 20; x++){
  42. for (int y = 0; y < 5; y++){
  43. if (backup[x][y] == 1)
  44. {
  45. seat[x][y] = 1;
  46. }
  47. }
  48. }
  49. flag = 1;
  50. break;
  51. }
  52. else{ //座位不够分
  53. break;
  54. }
  55. }
  56. }
  57. if (flag == 1)
  58. break;
  59. }
  60. if (flag == 0){
  61. for (int j = 0; j < 20; j++){
  62. for (int k = 0; k < 5; k++){
  63. if (seat[j][k] == 0 && res>0){
  64. seat[j][k] = 1;
  65. res--;
  66. cout << j * 5 + k + 1 << " ";
  67. }
  68. }
  69. }
  70. cout << endl;
  71. }
  72. }
  73. return 0;
  74. }

俄罗斯方块

  1. #include <iostream>
  2. const int ROW = 15;
  3. const int COL = 10;
  4. const int N = 4;
  5. int board[ROW + 1][COL];
  6. int block[N][N];
  7. struct {
  8. int row, col;
  9. } coords[N];
  10. using namespace std;
  11. int main()
  12. {
  13. int row, col;
  14. // 输入数据
  15. for (int i = 0; i < ROW; i++)
  16. for (int j = 0; j < COL; j++)
  17. cin >> board[i][j];
  18. for (int i = 0; i < N; i++)
  19. for (int j = 0; j < N; j++)
  20. cin >> block[i][j];
  21. cin >> col;
  22. // 底边全放1
  23. for (int j = 0; j < COL; j++)
  24. board[ROW][j] = 1;
  25. // 提取小方块坐标
  26. int k = 0;
  27. for (int i = N - 1; i >= 0; i--)
  28. for (int j = 0; j < N; j++)
  29. if (block[i][j] == 1) {
  30. coords[k].row = i;
  31. coords[k].col = j;
  32. k++;
  33. }
  34. // 模拟小方块落下过程(选取参考点原点进行搜索,从当前坐标点开始加上小矩阵元素为1的坐标,
  35. //判断其位置是否为1 ,位置上为1则停止)
  36. row = 1;
  37. col--;
  38. bool checkflag;
  39. for (;;) {
  40. checkflag = false;
  41. for (int i = 0; i < N; i++)
  42. if (board[row + coords[i].row][col + coords[i].col] == 1) {
  43. checkflag = true;
  44. break;
  45. }
  46. if (checkflag)
  47. break;
  48. row++;
  49. }
  50. row--;
  51. // 合并小方块到方格
  52. for (int i = 0; i < N; i++)
  53. board[row + coords[i].row][col + coords[i].col] = 1;
  54. // 输出结果
  55. for (int i = 0; i < ROW; i++) {
  56. for (int j = 0; j < COL; j++) {
  57. if (j != 0)
  58. cout << " ";
  59. cout << board[i][j];
  60. }
  61. cout << endl;
  62. }
  63. return 0;
  64. }

消除类游戏

  1. #include <iostream>
  2. using namespace std;
  3. int num[50][50];
  4. int backup[50][50];
  5. int n, m;
  6. int main()
  7. {
  8. cin >> n >> m;
  9. for (int i = 0; i < n; i++){
  10. for (int j = 0; j < m; j++){
  11. cin >> num[i][j];
  12. backup[i][j] = num[i][j];
  13. }
  14. }
  15. // 行扫描
  16. for (int i = 0; i < n; i++){
  17. for (int j = 0; j < m - 1; j++){
  18. int t = num[i][j];
  19. int count = 1;
  20. for (int k = j + 1; k < m; k++){
  21. if (num[i][k] != t)
  22. break;
  23. else
  24. count++;
  25. }
  26. if (count >= 3){
  27. for (int k = j; k < j + count; k++){
  28. backup[i][k] = 0;
  29. }
  30. }
  31. }
  32. }
  33. // 列扫描
  34. for (int i = 0; i < m; i++){
  35. for (int j = 0; j < n - 1; j++){
  36. int t = num[j][i];
  37. int count = 1;
  38. for (int k = j + 1; k < n; k++){
  39. if (num[k][i] != t)
  40. break;
  41. else
  42. count++;
  43. }
  44. if (count >= 3){
  45. for (int k = j; k < j + count; k++){
  46. backup[k][i] = 0;
  47. }
  48. }
  49. }
  50. }
  51. // 输出
  52. for (int i = 0; i < n; i++){
  53. for (int j = 0; j < m; j++){
  54. if (j == m - 1)
  55. cout << backup[i][j];
  56. else
  57. cout << backup[i][j] << " ";
  58. }
  59. cout << endl;
  60. }
  61. return 0;
  62. }

学生排队

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. int n, m;
  6. vector<int> v;
  7. int find(int num){
  8. for (int i = 0; i < v.size(); i++){
  9. if (num == v[i])
  10. return i+1;
  11. }
  12. return -1;
  13. }
  14. int main()
  15. {
  16. cin >> n;
  17. cin >> m;
  18. for (int i = 0; i < n; i++){
  19. v.push_back(i + 1);
  20. }
  21. for (int i = 0; i < m; i++){
  22. int p, q;
  23. cin >> p >> q;
  24. int pos = find(p);
  25. //cout << pos << endl;
  26. if (q >= 0){
  27. //cout << *v.begin() << endl;
  28. v.insert(v.begin() + pos + q, p);
  29. v.erase(v.begin() + pos - 1);
  30. }
  31. else{
  32. //cout << *v.begin() << endl;
  33. v.insert(v.begin() + pos - 1 + q, p);
  34. v.erase(v.begin() + pos);
  35. }
  36. }
  37. for (int i = 0; i < v.size(); i++){
  38. cout << v[i] << " ";
  39. }
  40. }

地铁修建

  1. # include <iostream>
  2. # include <queue>
  3. # include <functional>
  4. using namespace std;
  5. typedef pair<int, int> pii;
  6. const int maxn = 100000 + 100;
  7. const int INF = INT_MAX;
  8. struct node
  9. {
  10. int from, to, dist;
  11. node(int from, int to, int dist) :from(from), to(to), dist(dist){}
  12. };
  13. int n, m;
  14. vector<node> edges;
  15. vector<int> g[maxn];
  16. bool visited[maxn];
  17. int d[maxn];
  18. void AddEdge(int from, int to, int dist)
  19. {
  20. edges.push_back(node(from, to, dist));
  21. g[from].push_back(edges.size() - 1);
  22. }
  23. void dij(int start)
  24. {
  25. priority_queue<pii, vector<pii>, greater<pii> >q;//d和from
  26. for (int i = 0; i<n; i++) d[i] = INF;
  27. d[start] = 0;
  28. memset(visited, 0, sizeof(visited));
  29. q.push(make_pair(0, start));
  30. while (!q.empty()){
  31. pii x = q.top(); q.pop();
  32. int u = x.second;
  33. if (visited[u]) continue;
  34. visited[u] = true;
  35. for (int i = 0; i<g[u].size(); i++){
  36. node &e = edges[g[u][i]];
  37. //if (d[e.to]>max(d[u], e.dist)){//改变松弛策略
  38. // d[e.to] = max(d[u], e.dist);
  39. // q.push(make_pair(d[e.to], e.to));
  40. //}
  41. if (d[e.to]> d[u] + e.dist){//改变松弛策略
  42. d[e.to] = d[u] + e.dist;
  43. q.push(make_pair(d[e.to], e.to));
  44. }
  45. }
  46. }
  47. }
  48. int main()
  49. {
  50. cin >> n >> m;
  51. for (int i = 0; i<m; i++){
  52. int a, b, c;
  53. cin >> a >> b >> c;
  54. AddEdge(a - 1, b - 1, c);// 只写一个代表:有向图
  55. //AddEdge(b - 1, a - 1, c); //两个同时写代表:无向图
  56. }
  57. dij(0);
  58. cout << d[n - 1] << endl;
  59. return 0;
  60. }

棋局评估

  1. #include <iostream>
  2. #include <cstring>
  3. #include <map>
  4. using namespace std;
  5. int a[9];
  6. map<int, int> mymap;
  7. int isover(){
  8. for (int i = 0; i < 3; i++){ //检测列,仔细计算下,容易出错
  9. if (a[i] == a[i + 3] && a[i] == a[i + 6] && a[i])
  10. return a[i];
  11. }
  12. for (int i = 0; i < 9; i += 3){//检测行
  13. if (a[i] == a[i + 1] && a[i] == a[i + 2] && a[i])
  14. return a[i];
  15. }
  16. if (a[0] == a[4] && a[0] == a[8] && a[0])//检测对角
  17. return a[0];
  18. if (a[2] == a[4] && a[2] == a[6] && a[2])
  19. return a[2];
  20. return 0;
  21. }
  22. int dp(){
  23. int aa = 0; //状态
  24. for (int i = 0; i < 9; i++){
  25. aa = aa * 10 + a[i];
  26. }
  27. if (mymap.find(aa) != mymap.end()){ //记忆化搜索,若当前状态出现过,则不再重新计算。
  28. return mymap[aa];
  29. }
  30. int ct = 0;
  31. for (int i = 0; i < 9; i++) //找空余的0
  32. if (a[i])
  33. ct++;
  34. int rt = isover();
  35. if (rt == 1) //Alice赢
  36. return 10 - ct;
  37. if (rt == 2) // Bob赢
  38. return -(10 - ct);
  39. if (ct == 9 && rt == 0) //下满了,并且未分出胜负,则平局
  40. return 0;
  41. int an = 0;
  42. if (ct % 2 == 0){ //轮到Alice
  43. an = -100;
  44. for (int i = 0; i < 9; i++){
  45. if (a[i] == 0){ //遍历所有空格
  46. a[i] = 1;
  47. int s = dp();
  48. if (an < s){ //找到得分最高的
  49. an = s;
  50. }
  51. a[i] = 0;
  52. }
  53. }
  54. }
  55. else{ //轮到Bob
  56. an = 100;
  57. for (int i = 0; i < 9; i++){
  58. if (a[i] == 0){
  59. a[i] = 2;
  60. int s = dp();
  61. if (an > s){//找到得分最低的
  62. an = s;
  63. }
  64. a[i] = 0;
  65. }
  66. }
  67. }
  68. return mymap[aa] = an;
  69. }
  70. int main(){
  71. int t;
  72. cin >> t;
  73. while (t--){
  74. mymap.erase(mymap.begin(), mymap.end());
  75. for (int i = 0; i < 9; i++) {
  76. cin >> a[i];
  77. }
  78. cout << dp() << endl;
  79. }
  80. return 0;
  81. }

最大的矩形

  1. #include<iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. int n;
  6. int num[1005];
  7. int find_min(int i, int j){
  8. int min = 99999999;
  9. for (int k = i; k <= j; k++){
  10. if (num[k] < min){
  11. min = num[k];
  12. }
  13. }
  14. return min;
  15. }
  16. int main(){
  17. cin >> n;
  18. for (int i = 0; i < n; i++){
  19. cin >> num[i];
  20. }
  21. int max = -99999;
  22. for (int i = 0; i < n-1; i++){
  23. for (int j = i+1; j < n; j++){
  24. int res = find_min(i, j) * (j-i+1);
  25. if (res > max){
  26. max = res;
  27. }
  28. }
  29. }
  30. cout << max << endl;
  31. return 0;
  32. }

有趣的数

  1. #include <iostream>
  2. using namespace std;
  3. /* 状态分析: states[i][0]表示第i位状态为0的情况
  4. 0--用了2,剩0,1,3
  5. 1--用了0,2,剩1,3
  6. 2--用了2,3,剩0,1
  7. 3--用了0,1,2,剩3
  8. 4--用了0,2,3,剩1
  9. 5--全部用了
  10. */
  11. long long states[1005][6];
  12. int main(){
  13. long mod = 1000000007;
  14. int n;
  15. cin >> n;
  16. for (int i = 0; i<6; i++)
  17. states[0][i] = 0;
  18. for (int i = 1; i <= n; i++)
  19. {
  20. int j = i - 1;
  21. //只能以2开头,所以只存在一种情况
  22. states[i][0] = 1;
  23. //1、可以由第i-1步状态为0到达状态第i步的状态1
  24. //2、可以由第i-1步状态为1到达状态第i步的状态1,此时第i位只能填2或0。
  25. states[i][1] = (states[j][0] + states[j][1] * 2) % mod;
  26. //1、可以由第i-1步状态为0到达状态第i步的状态2
  27. //2、可以由第i-1步状态为2到达状态第i步的状态2,此时第i位只能填3。
  28. states[i][2] = (states[j][0] + states[j][2]) % mod;
  29. //1、可以由第i-1步状态为1到达状态第i步的状态3。
  30. //2、可以由第i-1步状态为3到达状态第i步的状态3,此时第i位只能填3或1。
  31. states[i][3] = (states[j][1] + states[j][3] * 2) % mod;
  32. //1、可以由第i-1步状态为1或者2到达状态第i步的状态4。
  33. //2、可以由第i-1步状态为4到达状态第i步的状态4,此时第i位只能填3或1。
  34. states[i][4] = (states[j][1] + states[j][2] + states[j][4] * 2) % mod;
  35. //1、第i-1步只剩一个数字到达第i步的状态,此时第i位只能填1或3。
  36. //2、第i-1步不剩任何数字到达第i步的状态,此时此时第i位只能填3或1。
  37. states[i][5] = (states[j][3] + states[j][4] + states[j][5] * 2) % mod;
  38. }
  39. cout << states[n][5] << endl;
  40. return 0;
  41. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注