作业四

/*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;
} 

 

posted @ 2019-10-30 11:05  sqsq  阅读(584)  评论(0编辑  收藏  举报