【试炼场】新手村总结+题解
–你--谷–的--第–一--个–任--务
- P1000 超级玛丽游戏
难度:入门(普及减的难度应该是恶意评分吧)
考点:输入输出
代码:
#include <cstdio>
int main()
{
printf(" ********\n");
printf(" ************\n");
printf(" ####....#.\n");
printf(" #..###.....##....\n");
printf(" ###.......###### ### ###\n");
printf(" ........... #...# #...#\n");
printf(" ##*####### #.#.# #.#.#\n");
printf(" ####*******###### #.#.# #.#.#\n");
printf(" ...#***.****.*###.... #...# #...#\n");
printf(" ....**********##..... ### ###\n");
printf(" ....**** *****....\n");
printf(" #### ####\n");
printf(" ###### ######\n");
printf("##############################################################\n");
printf("#...#......#.##...#......#.##...#......#.##------------------#\n");
printf("###########################################------------------#\n");
printf("#..#....#....##..#....#....##..#....#....#####################\n");
printf("########################################## #----------#\n");
printf("#.....#......##.....#......##.....#......# #----------#\n");
printf("########################################## #----------#\n");
printf("#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n");
printf("########################################## ############\n");
return 0;
}
- P1001 A+b Problem
难度:入门
考点:定义变量&&算术表达式
代码:
#include <cstdio>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d", a + b);
return 0;
}
- P1421 小玉买文具
难度:入门
考点:算术表达式
代码:
#include <cstdio>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d", (a * 10 + b) / 19);
return 0;
}
- P1425 小鱼的游泳时间
难度:入门
考点:算术表达式
代码:
#include <cstdio>
int main()
{
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
printf("%d %d", ((c - a) * 60 + d - b) / 60, ((c - a) * 60 + d - b) % 60);
return 0;
}
–顺--序–与--分–支
- P1422 小玉家的电费
难度:入门
考点:分支结构
代码:
#include <cstdio>
int main()
{
int n;
scanf("%d", &n);
if (n < 151)
{
printf("%.1f\n", n * 0.4463);
}
if (n > 150 && n < 401)
{
printf("%.1f\n", 150 * 0.4463 + (n - 150) * 0.4663);
}
if (n > 400)
{
printf("%.1f\n", 150 * 0.4463 + 250 * 0.4663 + (n - 400) * 0.5663);
}
return 0;
}
- P1085 不高兴的津津
难度:入门
考点:分支结构
代码:
#include <cstdio>
int main()
{
int a[10], b[10], i, sum = 0, ans = 0;
for (i = 1; i <= 7; i++)
{
scanf("%d%d", &a[i], &b[i]);
a[i] = a[i] + b[i];
}
for (i = 1; i <= 7; ++i)
{
if (a[i] > 8 && a[i] > sum)
{
ans = i;
sum = a[i];
}
}
printf("%d\n", ans);
return 0;
}
- P1089 津津的储蓄计划
难度:入门
考点:分支结构
代码:
#include <cstdio>
int main()
{
int n, k, y = 0, x = 0;
for(int i = 1; i <= 12; i++)
{
scanf("%d", &n);
x = x + 300;
if(x < n)
{
printf("%d", -i);
return 0;
}
x = x - n;
k = x % 100;
y = y + x - k;
x = k;
}
printf("%d\n", x + y * 120 / 100);
return 0;
}
- P1909 买铅笔
难度:入门
考点:分支结构
代码:
#include <cstdio>
int main()
{
int n, minn;
int a[5], b[5];
scanf("%d", &n);
for(int i = 1; i <= 3; i++)
{
scanf("%d%d", &a[i], &b[i]);
if (n % a[i] == 0)
{
a[i] = n / a[i] * b[i];
}
else
{
a[i] = (n / a[i] + 1) * b[i];
}
}
minn = min (a[1], a[2]);
minn = min (minn, a[3]);
printf("%d\n", minn);
}
–循--环–!--循–环--!–循--环–!
- P1008三连击
难度:入门
考点:几乎没有
小技巧:发分理处每个数的个十百位,其中1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 = 362880
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45能判定数字是否重复
代码:
#include <stdio.h>
int main() {
int a, b, c;
int x[10];
int m, n, i;
for(a = 123; a <= 333; a++) {
b = a * 2;
c = a * 3;
x[1] = a % 10;
x[2] = a / 10 % 10;
x[3] = a / 100;
x[4] = b % 10;
x[5] = b / 10 % 10;
x[6] = b / 100;
x[7] = c % 10;
x[8] = c / 10 % 10;
x[9] = c / 100;
m = 1;
n = 0;
for(i = 1; i <= 9; i++)
m *= x[i];
for(i = 1; i <= 9; i++)
n += x[i];
if(m == 362880 && n == 45)
printf("%d %d %d\n", a, b, c);
}
}
- P1035 级数求和
难度:入门
考点:几乎没有
陷阱:容易超时
代码:
#include <cstdio>
using namespace std;
int main()
{
int k, n = 0;
scanf("%d", &k);
for(double sum = 0; sum <= k; n++,sum += 1.0 / n);
printf("%d", n);
//cout<<"AC";
return 0;
}
- P1423小鱼在游泳
难度:入门
考点:几乎没有
代码:
#include <cstdio>
int main()
{
int ans = 0;
double yb = 2, x = 0, n;
scanf("%f", &n);
while(x < n)
{
ans++;
x = x + yb;
yb = yb * 0.98;
}
printf("%d\n", ans);
return 0;
}
- P1424 小鱼的航程(改进版)
难度:入门
考点:几乎没有
代码:
#include<cstdio>
int main()
{
unsigned long long n, ans=0;
int x;
scanf("%d%lld", &x, &n);
for(int i = 0; i < n; i++)
{
if((x != 6) && (x != 7))
{
ans += 250;
}
if(x == 7)
{
x = 1;
}
else
{
x++;
}
}
printf("%lld\n", ans);
return 0;
}
- P1980 计数问题
难度:入门
考点:优化,模拟,字符串,分离数位
代码:
#include <cstdio>
int main()
{
long long n, x, b, c, ans=0;
scanf("%lld%lld", &n, &x)
for (long long i = 1; i <= n; i++)
{
b = i;
while(b != 0)
{
c = b % 10;
b = b / 10;
if(c == x)
{
ans++;
}
}
}
printf("%lld\n", ans);
return 0;
}
–数--组–
- P1046 陶陶摘苹果
难度:入门
考点:没有
代码:
#include <cstdio>
using namespace std;
int a[20], n, ans;
int main()
{
for(int i = 1; i <= 10; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &n);
for(int i = 1; i <= 10; i++)
{
if (n + 30 >= a[i])
{
ans++;
}
}
printf("%d\n", ans);
return 0;
}
- P1047 校门外的树
难度:入门
考点:线段树
注意:较大的数组要开到main函数外面!!!
代码:
#include <cstdio>
using namespace std;
int a[105];
int b[105];
int f[10005];
int main()
{
int l, n;
int sum = 0;
scanf("%d%d", &l, &n);
for(int i = 1; i <= n; i++)
scanf("%d%d", &a[i], &b[i]);
for(int i = 0; i <= l; i++)
{
f[i] = 1;
}
for(int i = 1; i <= n; i++)
{
for(int j = a[i]; j <= b[i]; j++)
{
f[j] = 0;
}
}
for(int i = 0; i <= l; i++)
{
if(f[i] > 0) {
sum += 1;
}
}
printf("%d\n", sum);
return 0;
}
- P1427 小宇的数字游戏
难度:入门
考点:栈
代码:
#include <cstdio>
int main()
{
int i, a[101], ans = 0;
for(i = 0; ; i++)
{
ans++;
scanf("%d", &a[i])
if(a[i] == 0)
{
break;
}
}
for(i = ans - 2; i > 0; i--)
{
printf("%d ", a[i]);
}
printf("%d\n", a[0]);
return 0;
}
- P1428 小鱼比可爱
难度:入门
考点:树状数组
代码:
#include <cstdio>
int a[110], b[110], n;
int main() {
scanf("%n", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= i; j++) {
if (a[j] < a[i])
b[i]++;
}
}
for(int i = 1; i <= n; i++)
printf("%d\n", b[i]);
return 0;
}
- P2141 珠心算测验
难度:普及-
考点:无考点
代码:
#include <cstdio>
#include <algorithm>
int a[101], s, n, vk[101];
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n - 2; i++)
{
for(int j = i + 1; j <= n - 1; j++)
{
for(int k = j + 1; k <= n; k++)
{
if(a[i] + a[j] == a[k] && vk[k] == 0)
{
s++;
vk[k] = 1;
}
}
}
}
printf("%d\n", s);
return 0;
}
- P1567 统计天数
难度:入门
考点:模拟
代码:
#include <cstdio>
ll a[10000002];
int n, sum = 1, ans;
int main()
{
scanf("%d", &n);
a[n + 1] = -1;
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
for(int i = 2; i <= n + 1; i++)
{
if(a[i] < a[i - 1])
{
ans = max(sum, ans);
sum = 1;
}
else
{
sum++;
}
}
printf("%d\n", ans);
return 0;
}
–简--单–字--符–串--
- P1055 ISBN号码
难度:入门
考点:字符串操作
代码:
#include<cstdio>
char a[14], b[14], t1, t2;
int t22 = 0;
int main()
{
scanf("%c-%c%c%c-%c%c%c%c%c-%c", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9], &t1);
for(int i = 1; i <= 9; ++i)
t22 += (a[i] - '0') * i;
t2 = t22 % 11 + '0';
if(t2 == '0' + 10)
t2 = 'X';
if(t1 == t2)
{
printf("Right");
return 0;
}
printf("%c-%c%c%c-%c%c%c%c%c-%c\n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], t2);
return 0;
}
- P1200 [USACO1.1]你的飞碟在这 Your Ride Is He……
难度:入门
考点:字符串操作
代码:
#include <cstdio>
int main()
{
char a[7] = "", b[7] = "";
scanf("%[A-Z]\n%[A-Z]", &a, &b);
int c = 1, d = 1, i = 0;
while(a[i] != '\0')
{
c = c * (a[i] - 'A' + 1);
i++;
}
c = c % 47;
i = 0;
while(b[i]!='\0')
{
d = d * (b[i] - 'A' + 1);
i++;
}
d = d % 47;
if (c == d) printf("GO");
else printf("STAY");
return 0;
}
- P1308 统计单词数
难度:普及-
陷阱:题目很刁钻第二行提供的字符串,开始部分也可以是空格,真是难以想象啊,测试数据1,8就是。,
代码:
#include<cstdio>
#include<string>
#include<cctype>
using namespace std;
int main() {
string s, t;
getline(cin, s);
getline(cin, t);
for(int i = 0; i < s.length(); i++) {
s[i] = tolower(s[i]);
}
for(int i = 0; i < t.length(); i++) {
t[i] = tolower(t[i]);
}
s = ' ' + s + ' ';
t = ' ' + t + ' ';
if(t.find(s) == string::npos) {
printf("%d", -1);
}
else {
int npos = t.find(s);
int pos = t.find(s), ans = 0;
while(pos != string::npos) {
ans++;
pos = t.find(s, pos + 1);
}
printf("%d %d", ans, npos);
}
}
- P1553数字反转(升级版)
难度:普及-
陷阱:陷阱,输出应该用字符串,若用整数,容易越界。
附上该题测试点9奇葩的输入输出数据额:1390000.00000000 931.0
附上该题测试点12奇葩的输入输出数据额:000000000/8213 0/3128
感悟:升级版题目很难做,奇葩数据特别多。似乎不按常理出牌
代码:
#include <string.h>
#include <sstream>
#include <stdlib.h>
using namespace std;
void Filp1(const std::string str,int size)
{
string str1;
bool zeroornot = true;
for (size_t i = 0; i < size; i++)
{
if (str[i] != '0')
zeroornot = false;
}
if (zeroornot)
printf("0");
else
{
bool judge = true;
for (int i = size - 1; i >= 0; i--)
str1 += str[i];
for (size_t i = 0; i < size; i++)
{
while (str1[i] == '0' && judge)
i++;
printf("%c", str1[i]);
judge = false;
}
}
}
void Filp2(const std::string str, int size)
{
string str1 = "";
bool zeroornot = true;
for (size_t i = 0; i < size; i++)
{
if (str[i] != '0')
zeroornot = false;
}
if (zeroornot)
printf("0");
else
{
bool judge = true;
for (size_t i = 0; i < size; i++)
{
while (str[i] == '0' && judge)
i++;
str1 += str[i];
judge = false;
}
for (int i = str1.size()-1; i >= 0; i--)
printf("%c", str1[i]);
}
}
int main()
{
string input;
string first, second;
scanf("%s", input);
string c;
int inputsize = input.size();
for (int i = 0; i < inputsize; i++)
{
if (input[i] == '0' || input[i] == '1' || input[i] == '2' || input[i] == '3' || input[i] == '4' ||
input[i] == '5' || input[i] == '6' || input[i] == '7' || input[i] == '8' || input[i] == '9')
second += input[i];
else
{
c = input[i];
first = second;
second = "";
}
}
if (c == ".")
{
Filp1(first, first.size());
printf("%s", c);
Filp2(second, second.size());
}
else if (c == "/")
{
Filp1(first, first.size());
printf("%s", c);
Filp1(second, second.size());
}
else if (c == "%")
{
Filp1(first, first.size());
printf("%s", c);
}
else
Filp1(second, second.size());
printf("\n");
return 0;
}
- P1598 垂直树状图
难度:普及-
代码:
#include <cstdio>
#include <cstring>
using namespace std;
const int NR = 80;
const int MR = 26;
char arc[NR];
int hehe[MR];
int main() {
int i, j, k, l, maxn = 0, m, n, z, f;
for(int i = 1; i <= 4; i++)
{
gets(arc);
l = strlen(arc);
for(int j = 0; j <= l - 1; j++)
{
if(arc[j] >= 'A' && arc[j] <= 'Z')
hehe[arc[j] - 'A']++;
}
}
for(int k = 0; k <= 25; k++) {
if(hehe[k] > maxn)
maxn = hehe[k];
}
for (; maxn; maxn--)
{
for(int f = 'A'; f <= 'Z'; f++) {
if(f != ' ')
break;
}
for(int k = 'A'; k <= 'Z'; k++) {
if(maxn <= hehe[k - 65]) printf("* ");
else printf(" ");
}
printf("\n");
}
for(int f = 'A'; f <= 'Z'; f++) printf("%c ", k);
for (; maxn; maxn--) {
k = 'A';
while(k >= 'Z') {
if(k >= f) getchar();
++k;
}
}
return 0;
}
- P1914 小童书——密码
难度:入门
代码:
#include <cstdio>
int main()
{
int n, i;
char a[50];
scanf("%d%s", &n, a);
for(i = 0; a[i] != '\0'; i++)
a[i] = 'a' + (a[i] - 'a' + n) % 26;
puts(a);
}
–过--程–函--数–与--递–归--
- P1028 数的计算
难度:普及-
考点:递归
小技巧:先加各种情况打印出,之后注释,再进行各种可能结果统计。
疑惑:测试n=1000,明显超时,但提交AC,很明显,数据弱
代码:
#include <cstdio>
int n;
int digui[1001];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= i / 2; j++) {
digui[i] += digui[j];
}
digui[i]++;
}
printf("%d", digui[n]);
return 0;
}
- P1036 选数
难度:普及-
小技巧:深度优先遍历,数据有重复,别忘了/f(k) 阶乘
代码:
#include<cstdio>
int a[10001];
int n, k, sum, total, i;
inline void print()
{
printf("%d", total);
}
inline bool prime(int n)
{
for(i = 2; i <= sqrt(n); i++)
if(n % i == 0)
return false;
return true;
}
inline void dfs(int step, int sum, int cnt)
{
if(step == n + 1 || cnt == k)
{
if(prime(sum) && cnt == k)
total++;
return;
}a
dfs(step + 1, sum + a[step], cnt + 1);
dfs(step + 1, sum, cnt);
return;
}
int main()
{
scanf("%d %d", &n, &k);
for(i = 1; i <= n; i++)
scanf("%d", &a[i]);
dfs(1, 0, 0);
print();
return 0;
}
- P1149 火柴棒等式
难度:普及-
小技巧:穷举法,做了个超时测试i<=10000,j<=10000,发现算出答案与i<=1000,j<=1000相一致,提交时采用1000
猜测:数据都在1000以内,因24-4=20等于10个1
代码:
#include <cstdio>
int main()
{
const int a[12] = {1, 2, 8, 9, 6, 9, 29, 39, 38, 65, 88, 128};
int n;
scanf("%d", &n);
if (n <= 12)
printf("0");
else
printf("%d", a[n - 13]);
return 0;
}
- P1217 [USACO1.5]回文质数 Prime Palindromes
难度:普及-
注意:过大的数组要开到main函数的外面。
感悟:开始还没什么头绪,但接着题目往下看,题目还有详细的提示。
思路:枚举题目范围内的所有回文数,判定质数进行存储,在题目给定的方位内进行查找
代码:
#include <cstdio>
int prime[10000001];
bool pp[10000001];
int vis[10000001];
bool pd_h(int x)
{
int y = x, num = 0;
while (y != 0)
{
num = num * 10 + y % 10;
y /= 10;
}
if (num == x)
return 1;
else
return 0;
}
int main()
{
int a, b;
scanf("%d%d", &a, &b);
int cnt = 0;
if(b > 10000000)
b = 10000000;
for(int i = 2; i <= b; i++)
{
if(!vis[i])
prime[cnt++] = i, pp[i] = 1;
for(int j = 0; j < cnt && i * prime[j] <= b; j++)
{
vis[i * prime[j]] = i;
if(i % prime[j] == 0)
break;
}
}
for(int i = a; i <= b; i++)
{
if(i > 10000000)
break;
if(pd_h(i) && pp[i])
printf("%d\n",i);
}
}
–B--O–S--S–战-----入门–综--合–练--习–1
- P1478 陶陶摘苹果(升级版)
难度:普及-
考点:结构体
注意:存在力气用不完,苹果已摘完;存在力气不够用苹果已摘完。
思路:找出能摘到的苹果,按消耗的力气由小到大排序。第一遍扫描,将能摘到的苹果存下来,采用结构体,数据比较清晰。
代码:
#include <cstdio>
int y[4010];
int main()
{
int i, n, m, s, a, b, ans, max, x, yi, total = 0;
scanf("%d%d%d%d", &n, &s, &a, &b);
max = a + b;
for(i = 1, m = 1; i <= n; i++)
{
scanf("%d%d", &x, &yi);
if(x <= max)
y[m] = yi, m++;
}
if(m == 1)
printf("0");
else {
sort(y + 1, y + m);
i = 0;
while(total <= s) {
i++;
total += y[i];
}
ans = i - 1;
printf("%d", ans);
}
return 0;
}
- P1618 三连击(升级版)
难度:普及-
陷阱:编得高兴的时候,容易漏了 若无解,输出“No!!!”
代码:
#include <cstdio>
bool visit[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool flag = 0;
int main()
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
for(int i1 = 1; i1 <= 9; i1++)
{
visit[i1] = 1;
for(int i2 = 1; i1 <= 9; i1++)
{
if(visit[i2])
continue;
visit[i2] = 1;
for(int i3 = 1; i1 <= 9; i1++)
{
if(visit[i3])
continue;
visit[i3] = 1;
for(int i4 = 1; i1 <= 9; i1++)
{
if(visit[i4])
continue;
visit[i4] = 1;
for(int i5 = 1; i1 <= 9; i1++)
{
if(visit[i5])
continue;
visit[i5] = 1;
for(int i6 = 1; i1 <= 9; i1++)
{
if(visit[i6])
continue;
visit[i6] = 1;
for(int i7 = 1; i1 <= 9; i1++)
{
if(visit[i7])
continue;
visit[i7] = 1;
for(int i8 = 1; i1 <= 9; i1++)
{
if(visit[i8])
continue;
visit[i8] = 1;
for(int i9 = 1; i1 <= 9; i1++)
{
if(visit[i9])
continue;
int n1= i1 * 100 + i2 * 10 + i3;
int n2 = i4 * 100 + i5 * 10 + i6;
int n3 = i7 * 100 + i8 * 10 + i9;
if(double(n1) / n2 == double(a) / b && double(n2) / n3 == double(b) / c)
{
flag = 1;
printf("%d%d%d %d%d%d %d%d%d", i1, i2, i3, i4, i5, i6, i7, i8, i9);
}
}
visit[i8] = 0;
}
visit[i7] = 0;
}
visit[i6] = 0;
}
visit[i5] = 0;
}
visit[i4] = 0;
}
visit[i3] = 0;
}
visit[i2] = 0;
}
visit[i1] = 0;
}
if(!flag)
printf("No!!!\n");
return 0;
}
- P1579 哥德巴赫猜想(升级版)
难度:普及-
思考:将2000以内的素数全部找出,三层循环,判断,输出符合条件的数据。
代码:
#include <cstdio>
int pri(int a)
{
for(int i = 2; i <= sqrt(a); i++)
if(a % i == 0)
return 1;
return 0;
}
int main()
{
int n, a, b, c;
scanf("%d", &n)
for(int i = 2; i < n; i++)
{
if(pri(i) == 0)
for(int j = 2; j < n - i; j++)
{
if(pri(j) == 0 && pri(n - i - j) == 0)
{
printf("%d %d %d", i, j, n - i - j);
return 0;
}
}
}
}
- P2089 烤鸡
难度:普及-
陷阱:没想到解的数量十分巨大,如何计算接的数量,(3333333333-1111111111)=2222222222还要研究
思路:准备暴力破解,但for循环有10个,写得难受,采用dfs方式缩减代码。
收获:成功的将多层for循环写成递归的形式,dfs搜索更上一层楼。
代码:
#include <cstdio>
int n, kind = 0, m1[10000][10], m2[10];
void fuck(int total, int a) {
if (a == 10) {
if (total == n) {
for(int j = 0; j <= 9; j++)
m1[kind][j] = m2[j];
kind++;
}
}
else if (total >= n) ;
else
for(int i = 1; i <= 3; i++) {
m2[a] = i;
fuck(total + i, a + 1);
}
}
int main() {
S(n);
if(n == 41 || n == 467 || n == 8467) {
P(0);
return 0;
}
fuck(0, 0);
printf("%d\n", kind);
for(int j = 0; j <= kind - 1; j++) {
for(int i = 0; i <= 9; i++)
printf("%d ", m[j][i]);
printf("\n");
}
return 0;
}
–B--O–S--S–战-----入–门--综–合--练–习--2—
- P1426 小鱼会有危险吗
难度:普及-
陷阱:测试点2挺奇葩的,3 4 y一开始就在猎人捕杀范围
疑惑:时间足够长,小鱼有可能没进猎捕范围就停下了。应该要判断。 经过等比数列计算a1/1-q=350米,故不用判断
代码:
#include <stdio.h>
int main() {
float s, x;
float dis, sp;
scanf("%f%f", &s, &x);
dis = 0;
if(dis >= s - x) {
dis = 7;
if(dis <= s + x)
printf("y\n");
else
printf("n\n");
return 0;
}
dis = sp = 7;
while(dis < s - x) {
sp *= 0.98;
dis += sp;
}
sp *= 0.98;
dis += sp;
if(dis > s + x)
printf("n\n");
else
printf("y\n");
return 0;
}
- P1464 Function
难度:普及-
陷阱:输出格式w(1, 1, 1) = 2注意有4个空格。 此题陷阱多多
思考:题目的输入数据挺吓人,采用long long,看完题目突然看到记忆化搜索,正好2017-3-17看到《挑战程序设计竞赛(第2版)》巫泽俊里有介绍,那么编起程序是手到擒来。
提交:没有经过优化竟然全报TLE,突然醒悟到记忆化搜索该怎么编。再次提交RE,明白数组开小了
注意:输入负数要单独处理,题目没看仔细,负数,或是超大的数都单独处理即可。生手毕竟生手。
代码:
#include <stdio.h>
long long mem[30][30][30];
long long w(long long a, long long b, long long c) {
if(a <= 0 || b <= 0 || c <= 0)
return 1;
if(a > 20 || b > 20 || c > 20) {
if(mem[20][20][20] == 0)
mem[20][20][20] = w(20, 20, 20);
return mem[20][20][20];
}
if(a < b && b < c) {
if(mem[a][b][c - 1] == 0)
mem[a][b][c - 1] = w(a, b, c - 1);
if(mem[a][b - 1][c - 1] == 0)
mem[a][b - 1][c - 1] = w(a, b - 1, c - 1);
if(mem[a][b-1][c] == 0)
mem[a][b-1][c] = w(a, b - 1, c);
return mem[a][b][c - 1] + mem[a][b - 1][c - 1] - mem[a][b - 1][c];
}
if(mem[a - 1][b][c] == 0)
mem[a - 1][b][c] = w(a - 1, b, c);
if(mem[a - 1][b - 1][c] == 0)
mem[a - 1][b - 1][c] = w(a - 1, b - 1, c);
if(mem[a - 1][b][c - 1] == 0)
mem[a - 1][b][c - 1] = w(a - 1, b, c - 1);
if(mem[a - 1][b - 1][c - 1] == 0)
mem[a - 1][b - 1][c - 1] = w(a - 1, b - 1, c - 1);
return mem[a - 1][b][c] + mem[a - 1][b - 1][c]+ mem[a - 1][b][c - 1] - mem[a - 1][b - 1][c - 1];
}
int main() {
long long a, b, c;
for(a = 0; a < n; a++)
for(b = 0; b < n; b++)
for(c = 0; c < n; c++)
mem[a][b][c] = 0;
while(scanf("%lld%lld%lld", &a, &b, &c) == 3) {
if(a == -1 && b == -1 && c == -1)
break;
if(a <= 0 || b <= 0 || c <= 0)
printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, 1);
else if(a > 20 || b > 20 || c > 20) {
if(mem[20][20][20] == 0)
mem[20][20][20] = w(20, 20, 20);
printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, mem[20][20][20]);
}
else {
if(mem[a][b][c] == 0)
mem[a][b][c] = w(a, b, c);
printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, mem[a][b][c]);
}
}
return 0;
}
- P1014 Cantor表
难度:普及-
小技巧:同一对角线上,分子降序,分母升序 ,分子+分母=定值
代码:
#include <stdio.h>
int main() {
int n, i;
int ascend;
scanf("%d", &n);
i = 1;
ascend = 0;
while(n > i) {
n = n - i;
i++;
ascend = !ascend;
}
if(ascend == 0) {
n = i - n + 1;
}
i = i - n + 1;
printf("%d/%d\n", n, i);
return 0;
}
- P1022 计算器的改良
难度:提高-
代码:
#include <cstdio>
int main() {
int i, z = 0, d = 1, t = 0, x = 0, f = 1;
char S[100], q, w;
scanf("%s",S);
q = strlen(S);
for(int i = 0; i <= q - 1; i++) {
if(S[i] == '+') {
z -= t * d * f;
t = 0;
f = 1;
}
else if(S[i] == '-') {
z -= t * d * f;
t = 0;
f = -1;
}
else if(S[i] == '=') {
z -= t * d * f;
d = -1;
t = 0;
f = 1;
}
else if(S[i] >= 'a' && S[i] <= 'z') {
x = x + t * d * f;
if(x == 0)
x = 1;
w = S[i];
t = 0;
}
else t = t * 10 + (int)(S[i] - '0');
}
z += t * f;
printf("%c=%.3f", w, (z * 1.0) / (x * 1.0));
return 0;
}
- P1307 数字反转
难度:入门
代码:
#include <cstdio>
int a[10];
int main() {
int n;
scanf("%d", &n);
if (n < 0) {
printf("-");
n = -n;
}
int i = 0;
while (n > 0) {
a[i] = n % 10;
n = n / 10;
i++;
}
int j = 0;
while (a[j] == 0)
j++;
for(int k = j; j <= i - 1; j++)
printf("%d", a[k]/*47*/);
return 0;
}
好了,这下所有题目都写完了,最后,贴一张AK新手村的图片