中南林业科技大学第十一届程序设计大赛

A 链表的合并

这道题目签到题,我还以为排序会超时,结果就30个数据,发一波归并排序的思路。

#include<bits/stdc++.h>
using namespace std;
int main() {
  int a[21], b[21], c[105];
  for(int i = 0; i < 15; ++i) {
    scanf("%d", &a[i]);
  }
  for(int i = 0; i < 15; ++i) {
    scanf("%d", &b[i]);
  }
  int i = 0, j = 0, cnt = 0;
  while(i < 15 && j < 15) {
    if(a[i] > b[j]) {
      c[cnt++] = b[j++];
    } else {
      c[cnt++] = a[i++];
    }
  }
  while(i < 15) c[cnt++] = a[i++];
  while(j < 15) c[cnt++] = b[j++];
  for(int i = 0; i < 30; ++i) {
    printf("%d", c[i]);
    if(i != 29) printf(" ");
    else printf("\n");
  }
  return 0;
}

B 兑换零钱

DP

#include<bits/stdc++.h>
#define ll long long
const int mod = 1000000007;
using namespace std;
int money[] = {1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};
int dp[100005];
int main() {
  int T;
  scanf("%d", &T);
  while(T--) {
    int n;
    memset(dp, 0, sizeof(dp));
    scanf("%d", &n);
    dp[0] = 1;
    for(int i = 0; i < 13; ++i) {
      for(int j = money[i]; j <= n; ++j) {
        dp[j] = (dp[j - money[i]] + dp[j]) % mod;
      }
    }
    printf("%d\n", dp[n]);
  }
  return 0;
}

C 神奇的进制转换

任意进制转换模板

#include<iostream>
#include <cstring>
#include <string>
using namespace std;
string rev(string &s) { /*字符串逆序*/
    int i;
    string temp = "";
    for (i = s.length() - 1; i >= 0; i--)
        temp += s.at(i);
    return temp;
}
int getNum(char str) {
    int num;
    if (isdigit(str))
        num = str - '0';
    else if (str >= 'A' && str <= 'Z')
        num = str - 'A' + 10;
    else
        num = str - 'a' + 36;
    return num;
}
char getChar(int num) {
    char index[62] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
                       'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
                       'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a',
                       'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
                       'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
                     };
    return index[num];
}
 
/*分别表示被除数,除数,商、余数及被除数的进制*/
void Divide(string &dividend, int to, string &quotient, int *remainder,
            int from) {
    int i;
    int flag = 0; /*用来判断最后的商是否全为0*/
    int curDividend = 0; /*当前的被除数*/
    quotient = "";
    *remainder = 0;
    for (i = 0; i < dividend.length(); i++) {
        curDividend = (*remainder) * from + getNum(dividend.at(i));
        if (curDividend < to) {
            quotient += "0";
            *remainder = curDividend;
        } else {
            quotient += getChar(curDividend / to);
            *remainder = curDividend % to;
        }
    }
    /*对商进行处理,去除前导0*/
    for (i = 0; i < quotient.length(); i++) {
        if (quotient.at(i) != '0') {
            flag = 1;
            quotient = quotient.erase(0, i);
            /*删除从0开始的i个字符,返回新的字符串*/
            break;
        }
    }
    if (flag == 0)
        quotient = "0";
}
 
/*分别表示原进制大数、转换结果、原进制及目标进制,仅限在62进制以内*/
void Change(string &a, string &b, int from, int to) {
    int remainder;
    string quotient;
    b = "";
    Divide(a, to, quotient, &remainder, from);
    while (quotient.compare("0") != 0) {
        b += getChar(remainder);
        a = quotient;
        Divide(a, to, quotient, &remainder, from);
    }
    b += getChar(remainder);
    b = rev(b);
}
int main() {
  int t, n, m;
  string s, k;
  scanf("%d", &t);
  while(t--) {
    cin >> n >> m >> s;
    Change(s, k, n, m);
    cout << k << endl;
  }
}

D 最大的湖

简单dfs

#include<bits/stdc++.h>
#define ll long long
const int mod = 100;
const int MAX_N = 1000005;
using namespace std;
char maze[105][105];
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
int n, m, k;
int cnt;
void dfs(int x, int y) {
  maze[x][y] = '0';
  cnt += 1;
  for(int i = 0; i < 4; ++i) {
    int tx = dx[i] + x;
    int ty = dy[i] + y;
    if(tx >= 0 && tx < n && ty >= 0 && ty < m && maze[tx][ty] == '1') {
      dfs(tx, ty);
    }
  }
}
int main() {
  scanf("%d %d %d", &n, &m, &k);
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j)
      maze[i][j] = '0';
  }
  for(int i = 0; i < k; ++i) {
    int x, y;
    scanf("%d %d", &x, &y);
    maze[x - 1][y - 1] = '1';
  }
  int ans = -1;
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j) {
      if(maze[i][j] == '1') {
        cnt = 0;
        dfs(i, j);
        ans = max(ans, cnt);
      }
    }
  }
  printf("%d\n", ans);
	return 0;
}

E 砝码和天平

进制转换

#include<bits/stdc++.h>
#define ll long long
const int mod = 100;
const int MAX_N = 1000005;
using namespace std;
int main() {
  int T;
  scanf("%d", &T);
  while(T--) {
    int w, m;
    scanf("%d %d", &w, &m);
    int carry = 0;
    bool flag = true;
    while(m) {
      int t = m % w;
      m /= w;
      if(t + carry == 1 || t + carry == 0) {
        carry = 0;
      } else if(t + carry == w - 1 || t + carry == w) {
        carry = 1;
      } else {
        flag = false;
        break;
      }
    }
    if(flag == true) printf("YES\n");
    else printf("NO\n");
  }
	return 0;
}

F 得分

#include<bits/stdc++.h>
using namespace std;
int main() {
  int T;
  scanf("%d", &T);
  while(T--) {
    char st[1005];
    scanf("%s", st);
    int len = strlen(st), ans = 0, cnt = 0;
    for(int i = 0; i < len; ++i) {
      if(st[i] == 'O') {
        ans += 1;
      } else {
        cnt += (1 + ans) * ans / 2;
        ans = 0;
      }
    }
    if(st[len - 1] == 'O') cnt += (1 + ans) * ans / 2;
    printf("%d\n", cnt);
  }
  return 0;
}

G 0和5

被90整除的思路就是首先能被10整出就必须至少一个0,然后被9整除就是必须能被2个3整除,然后就能推出每位数相加之后要是45的倍数。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[1005];
int main() {
  int n;
  int Five = 0, Zero = 0;
  scanf("%d", &n);
  for(int i = 0; i < n; ++i) {
    scanf("%d", &a[i]);
    if(a[i] == 0) Zero += 1;
    else  Five += 1;
  }
  if(Five / 9 > 0 && Zero > 0) {
    for(int i = 0; i < Five / 9; ++i) 
      printf("555555555");
    for(int i = 0; i < Zero; ++i)
      printf("0");
  } else if(Zero > 0) {
    printf("0\n");
  } else {
    printf("-1\n");
  }
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值