1001 AlphaCode
http://soj.sysu.edu.cn/1001
- 题目:用[1,26]表示字母,给定一串数字,算出其代表的字母串有多少种排列组合
- 思路:动态规划
- 代码:
cin >> encry;
if (encry.compare("0") == 0)
break;
memset(dp, 0, sizeof(dp));
dp[0] = 1;
int n = encry.length();
for (int i = 1; i < n; i++) {
int joint = (encry[i-1] - '0') * 10 + encry[i] - '0';
// 一定不能在一起
if (encry[i-1] == '0' || encry[i-1] >= '3' || joint > 26) {
dp[i] = dp[i-1];
}
// 必须在一起
else if (encry[i] == '0'){
if (i < 2) dp[i] = 1;
else dp[i] = dp[i-2];
}
// 可在一起也可分开
else {
if (i < 2) dp[i] = 2;
else dp[i] = dp[i-2] + dp[i-1];
}
}
cout << dp[n-1] << endl;
1306 Sorting
http://soj.sysu.edu.cn/1306
- 题目:排序
- 思路:归并,冒泡
- 代码:
//冒泡
void BubbleSort(int arr[], int n)
{
int min, index, temp;
for (int i = 0; i < n; i++) {
min = arr[i];
index = i;
for (int j = i+1; j < n; j++) {
if (min > arr[j]) {
min = arr[j];
index = j;
}
}
if (index != i) {
temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
}
}
// 合并数组
void combine(int arr[], int beg, int mid, int end)
{
int *tmp = (int*) malloc(sizeof(int) * (end - beg + 1));
int p = beg, q = mid + 1, k = 0;
while (p <= mid && q <= end) {
if (arr[p] < arr[q]) {
tmp[k++] = arr[p++];
}
else if (arr[p] > arr[q]) {
tmp[k++] = arr[q++];
}
else {
tmp[k++] = arr[p++];
tmp[k++] = arr[q++];
}
}
if (p <= mid) {
for (int i = p; i <= mid; i++) {
tmp[k++] = arr[i];
}
}
if (q <= end) {
for (int i = q; i <= end; i++) {
tmp[k++] = arr[i];
}
}
for (int i = beg; i <= end; i++) {
arr[i] = tmp[i-beg];
}
free(tmp);
}
// 归并排序
void MergeSort(int arr[], int beg, int end)
{
if (end > beg) {
int mid = (end + beg) / 2;
MergeSort(arr, beg, mid);
MergeSort(arr, mid + 1, end);
combine(arr, beg, mid, end);
}
}
1438 Shopaholic
http://soj.sysu.edu.cn/1001
- 题目:商店买3免1,求最大折扣
- 思路:贪心
- 代码:
// 先排序
MergeSort(arr, 0, n-1);
int sum = 0;
// 贪心
for (int i = n-3; i >= 0; i -=3) {
sum +=arr[i];
}
printf("%d\n", sum);