【洛谷】【试炼场】新手村总结+题解

【试炼场】新手村总结+题解

–你--谷–的--第–一--个–任--务

  1. 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;
}
  1. P1001 A+b Problem

难度:入门

考点:定义变量&&算术表达式

代码:

#include <cstdio>
int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    printf("%d", a + b);
    return 0;
}
  1. P1421 小玉买文具

难度:入门

考点:算术表达式

代码:

#include <cstdio>
int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    printf("%d", (a * 10 + b) / 19);
    return 0;
}
  1. 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;
}

–顺--序–与--分–支

  1. 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;
}
  1. 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;
}
  1. 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;
}
  1. 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);
}

–循--环–!--循–环--!–循--环–!

  1. 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);
    }
}
  1. 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;
}
  1. 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;
}
  1. 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;
}
  1. 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;
}

–数--组–

  1. 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;
}
  1. 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;
}
  1. 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;
}
  1. 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;
}
  1. 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;
}
  1. 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;
}

–简--单–字--符–串--

  1. 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;
}
  1. 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;
}
  1. 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);
    }
}
  1. 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;
}
  1. 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;
}
  1. 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);
}

–过--程–函--数–与--递–归--

  1. 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;
}
  1. 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;
}
  1. 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;
}
  1. 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

  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;
}
  1. 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;
}
  1. 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;
                }  
            }  
    }  
}  
  1. 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—

  1. 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;
}
  1. 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;
}
  1. 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;
}
  1. 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; 
}
  1. 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新手村的图片

猜你喜欢

转载自blog.csdn.net/jzc20080511/article/details/85852526