• 作业四


    /*104.N皇后 (15分)
    C时间限制:3000 毫秒 |  C内存限制:3000 Kb
    题目内容:
     国际象棋中的皇后可以沿着水平线,垂直线,或者斜线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的
    放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧。
    该题要求N皇后的放置结果共有多少种
    输入描述
    输入一个正整数N(N小于16)

    输出描述
    输出结果

    输入样例
    8

    输出样例
    92*/

    #include<iostream>
    #include<stdio.h>
    #include<cmath>
    using namespace std;
    const int maxn = 20;
    int n;
    int tot = 0;
    int a[maxn];
    int query(int i){
        for(int j=0;j<i;j++){
            if(a[i]==a[j]||(abs(a[i]-a[j])==abs(i-j)))
                return 0;
        }
        return 1;
    }
    int queen(int i){
        if(i>=n){
            tot++;
            return 0;
        }
        for(int k=0;k<n;k++){
            a[i] = k;
            if(query(i)){
                queen(i+1);
            }
        }
        
    }
    int main(){
        cin>>n;
        queen(0);
        cout<<tot<<endl;
        return 0;
    }

    /*145.韩信走马分油 (15分)
    C时间限制:3000 毫秒 |  C内存限制:3000 Kb
    题目内容:
     泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论
    中著名的泊松分布。    有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾
    的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。    有3个容器,容量分别为12升,8升,5升。其中12升中装
    满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。    下面的列表是可能的操作状态记录:12,0,0
    4,8,0
    4,3,5
    9,3,0
    9,0,3
    1,8,3
    1,6,5    
    每行3个数据,分别表示12,8,6升容器中的油量    
    第一行表示初始状态,第二行表示把12升倒入8升容器后的状态,第三行是8升倒入5升,...    
    当然,同一个题目可能有多种不同的正确操作步骤。    本题目的要求是,请你编写程序,由用户输入:各个容器的容量,开始的
    状态,和要求的目标油量,程序则通过计算输出是否可能分成功-“Y”,“N”。
    例如,用户输入:
    12,8,5,12,0,0,6    
    用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,最后一个数是要求得到的油量(放在
    哪个容器里得到都可以)    则程序可以输出“Y”
    输入描述
    各个容器的容量,开始的状态,和要求的目标油量

    输出描述
    是否可能分成功-“Y”,“N”

    输入样例
    12,8,5,12,0,0,6

    输出样例
    Y
    */

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int x,y,z;
    int a,b,c;
    int n;
    int flag = 0;
    int fenyou(int a,int b,int c){
        if(a==n||b==n||c==n){
            flag = 1;
            cout<<"Y"<<endl;
            return 0;
        }
        if(a>=y&&b==0)    fenyou(a-y,y,c);    
        if(a>=z&&c==0)    fenyou(a-z,y,z);
        if(b>=x&&a==0)  fenyou(x,b-x,c);
        if(b>=z&&c==0)  fenyou(a,b-z,z);
        if(c>=x&&a==0)  fenyou(x,b,c-z);
        if(c>=y&&b==0)  fenyou(a,y,c-y);
        if((a>=(y-b))&&b<=y) fenyou(a-(y-b),y,c);
        if((a>=(z-c))&&c<=z) fenyou(a-(z-c),b,z);
        if((b>=(x-a)&&a<=x)) fenyou(x,b-(x-a),c);
        if((b>=(z-c))&&c<=z) fenyou(a,b-(z-c),z);
        if((c>=(x-a))&&a<=x) fenyou(x,b,c-(x-a));
        if((c>=(y-b))&&b<=y) fenyou(a,y,c-(y-b));
    }
    
    int main(){
        cin>>x>>y>>z>>a>>b>>c>>n;
        if(n>x&&n>y&&n>z)
            cout<<"N"<<endl;
        else
            fenyou(a,b,c);
        if(!flag)
            cout<<"N"<<endl;
        return 0;
    }

     /*503.事件安排 (10分)
    C时间限制:3000 毫秒 |  C内存限制:3000 Kb
    题目内容:
    小张最近很忙,记事本里有n件事情等待处理,每件事处理完毕后,能得到不同的奖励,而且都有一个截止日。一件事处理需要一整天
    时间,并且小张不能同时干其他事情。请你替小张安排一个事情处理的时间表,争取获得最大的奖励。
    输入描述
    第一行输入整数n,表示n个事情。随后输入n行,每行包括一个事情的截止日(不大于n)和处理收益。
    输出描述
    输出最大的总收益。
    输入样例
    5
    2 5
    2 7
    2 6
    2 8
    3 3
    输出样例
    18*/

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    const int maxn = 10000;
    struct node{
        int e;
        int v;
    }a[maxn];
    bool cmp(node a,node b){
        return a.v>b.v;
    }
    int main(){
        int n;
        cin>>n;
        int last = 0;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i].e,&a[i].v);
            if(a[i].e>=last) last = a[i].e;
        }
        sort(a+1,a+n+1,cmp);
        int b[maxn+5];
        memset(b,0,sizeof(b));
        for(int i=1;i<=n;i++){
            if(b[a[i].e]==0)  b[a[i].e] = a[i].v;
            else{
                for(int j = a[i].e-1;j>=1;j--){
                    if(b[j]==0){
                        b[j] = a[i].v;
                        break;
                    }
                }
            }
        }
        int ans = 0;
        for(int j = 1;j<=last;j++){
            ans +=b[j];
        }
        cout<<ans<<endl;
        return 0;
    } 
  • 相关阅读:
    NodeJS学习笔记 进阶 (11)Nodejs 进阶:调试日志打印:debug模块
    NodeJS学习笔记 进阶 (10)Nodejs 进阶:log4js入门实例(ok))
    NodeJS学习笔记 进阶 (9)express+cookie-parser:签名机制深入剖析(ok)
    NodeJS学习笔记 进阶 (8)express+morgan实现日志记录(ok)
    NodeJS学习笔记 进阶 (7)express+session实现简易身份认证(ok)
    NodeJS学习笔记 进阶 (6)本地调试远程服务器上的Node代码(ok)
    NodeJS学习笔记 进阶 (5)将图片转成datauri嵌入到html(ok)
    51nod 1287 线段树
    51nod 1043 数位dp
    51nod 1042 数位dp
  • 原文地址:https://www.cnblogs.com/lusiqi/p/11763614.html
Copyright © 2020-2023  润新知