zoukankan      html  css  js  c++  java
  • FZU ICPC 2020 寒假阶段测试 2

    P1464 Function

    题目描述

    对于一个递归函数w(a,b,c)如果a≤0 or b≤0 or c≤0就返回值1.如果a>20 or b>20 or c>20就返回w(20,20,20).
    如果a<b并且b<c 就返回w(a,b,c−1)+w(a,b−1,c−1)−w(a,b−1,c).其它的情况就返回w(a−1,b,c)+w(a−1,b−1,c)+w(a−1,b,c−1)−w(a−1,b−1,c−1)这是个简单的递归函数,但实现起来可能会有些问题。当a,b,c均为15时,调用的次数将非常的多。你要想个办法才行.
    /* absi2011 : 比如 w(30,−1,0)既满足条件1又满足条件2这种时候我们就按最上面的条件来算所以答案为1*/

    输入格式

    会有若干行。并以−1,−1,−1结束。保证输入的数在[−9223372036854775808,9223372036854775807]之间,并且是整数。

    输出格式

    输出若干行,每一行格式:
    w(a, b, c) = ans
    注意空格。

    输入 #1

    1 1 1
    2 2 2
    -1 -1 -1

    输出 #1

    w(1, 1, 1) = 2
    w(2, 2, 2) = 4

    说明/提示

    记忆化搜索

    Accepted

    本题提示很明显,需要我们采用记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    long long arr[30][30][30]={0};//记忆化搜索
    long long w(long long a,long long b,long long c){
        if(a<=0||b<=0||c<=0) return 1;
        else if(arr[a][b][c]!=0) return arr[a][b][c];
        else if(a>20||b>20||c>20) arr[a][b][c]=w(20,20,20);
        else if(a<b&&b<c) arr[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
        else arr[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
        return arr[a][b][c];
    }
        int main(){
            long long a,b,c;
            while(1){
            scanf("%lld %lld %lld",&a,&b,&c);
               // memset(arr,0,sizeof(arr));
                if(a==-1&&b==-1&&c==-1) break;
                printf("w(%lld, %lld, %lld) = ",a,b,c);
                if(a>20)  a=21;
                if(b>20)  b=21;
                if(c>20)  c=21;
                printf("%lld
    ",w(a,b,c));
            }
            return 0;
        }
    

    P1014 Cantor表

    题目描述

    现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
    1/1 , 1/2 , 1/3 , 1/4, 1/5, …
    2/1, 2/2 , 2/3, 2/4, …
    3/1 , 3/2, 3/3, …
    4/1, 4/2, …
    5/1, …

    我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…

    输入格式

    整数N(1≤N≤10000000)

    输出格式

    表中的第N项

    输入 #1

    7
    输出 #1
    1/4

    Accepted

    转至洛谷:
    因为题目中要求是以Z字型编号

    我们看题目中的表是:
    1/1,1/2,1/3 ……
    2/1,2/2,2/3 ……
    Z字型编号以后(把头向左偏45度):
    第一行:1/1 (1号)
    第二行:1/2 (2号) 2/1(3号)
    第三行:1/3 (6号) 2/2 (5号) 3/1 (4号)
    ↑ 观察法易得每一行比上一行多1
    代码里那个while循环,就是为了通过循环枚举,判断它在编号之后的第几行,第几个位置。

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
        int main(){
            int n;
            int i=1;//i表示第几行
            scanf("%d",&n);
            while(n>i){
                n-=i;
                i++;
            }
            if(!(i%2)) printf("%d/%d
    ",n,i+1-n); //第i行第j列 奇偶判断是正序还是倒序
            else printf("%d/%d
    ",i+1-n,n);
            return 0;
        }
    

    P1022 计算器的改良

    题目背景

    NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。

    题目描述

    为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
    4+3x=8
    6a−5+1=2−2a
    −5+12y=0
    ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
    你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。

    输入格式

    一个一元一次方程。

    输出格式

    解方程的结果(精确至小数点后三位)。

    输入 #1

    6a-5+1=2-2a

    输出 #1

    a=0.750

    Accepted

    转至洛谷:

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
        int main(){
            double sum=0,head=0;//sum是数字之和,head是系数之和
            char ch,p;//ch被用作读入每一个字符,p用来储存未知数
            int arr[100]={0},len=1,mid,pd;
            //arr[]储存每一个出现的数,l记录数组长度,mid分开等号两边,pd为判断此数字是正是负
            pd=1;//默认开头第一个数为正
            while(ch!='='){
                ch=getchar();
                if(ch=='-'){
                    len++;
                    pd=-1; //只要判断是-数,切换到下一个数,设置这个数为负数
                }
                if(ch=='+'){
                    len++;
                    pd=1;//判断为+,切换下一个数,设置这个数为正数
                }
                if(ch>='0'&&ch<='9'){
                    if(!arr[len]) arr[len]=(ch-'0')*pd;
                    else arr[len]=arr[len]*10+(ch-'0')*pd;
                }
                if(ch>='a'&&ch<='z'){
                    p=ch;
                    if(arr[len]){
                        head+=arr[len];
                        arr[len]=0;//如果有前面的系数,则存入系数集合,把塞在数字数组中的系数去掉
                    }
                    else{
                            head+=pd;//判断特殊情况如-x/+x
                            len--;//判断特殊情况如-x/+x
                        }
                    }
                }
                 mid=len;
                 len++;
                 pd=1;//存储mid,数组位数进一位,pd=1与上面同理
                 while (ch!='
    '){
                 ch=getchar();
                 if(ch=='-'){
                        len++;
                        pd=-1;
                            }
                            if(ch=='+'){
                                len++;
                                pd=1;
                            }
                            if(ch>='0'&&ch<='9'){
                                if(!arr[len]) arr[len]=(ch-'0')*pd;
                                else arr[len]=arr[len]*10+(ch-'0')*pd;
                            }
                     if(ch>='a'&&ch<='z'){//这里有点不一样,因为未知数要放在等号左边所以这里要减去系数
                         p=ch;
                         if(arr[len]){
                             head-=arr[len];
                             arr[len]=0;
                         }
                         else{
                             head-=pd;
                             len--;
                         }
                     }
             }
                for(int i=1;i<=len;i++){
                    if(i<=mid) sum-=arr[i];
                    else sum+=arr[i];
                }
            if(!(sum/head))//这里要加个特判断,因为会出现-0,虽然-0和0等效,但评测机并不吃这一套
               // 如果0除以一个负数得-0
                printf("%c=0.000
    ",p);
            else printf("%c=%.3f
    ",p,sum/head);
            return 0;
        }
       
    
  • 相关阅读:
    使用SQL语句对表进行分页查询
    [转]Message Crack Wizard for Win32 SDK Developer
    笔记——《C语言也能干大事》之对话框程序代码
    如何通过C#调用CHM帮助文件,显示到指定页面
    winform 数字输入控件初稿
    用JAVA在读取EXCEL文件时如何判断列隐藏
    css中height:100%不起作用的解决方法 项目个案
    枚举(enum)的常用操作
    转 VirtualBox“please use a kernel appropriate for your cpu”
    Asp.NET导出Excel文件乱码 终极解决方法
  • 原文地址:https://www.cnblogs.com/lvhang/p/12269870.html
Copyright © 2011-2022 走看看