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