当前位置:文档之家› OpenJudge算法设计与分析习题解答

OpenJudge算法设计与分析习题解答

}
3、鸡兔同笼
描述
一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子有 4 只脚,没有例外)。已经知道了笼子里面脚的 总数 a,问笼子里面至少有多少只动物,至多有多少只动物。
输入
一行,一个正整数 a (a < 32768)。
输出
一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格 分开。 如果没有满足要求的答案,则输出两个 0,中间用一个空格分开。
样例输入
45 2 3 2 1
样例输出
1 BeiJu 1 BeiJu 源代码: #include <stdio.h> #include <string.h> int b[ 222 ]; int a[ 222 ]; int n, m;
int main() {
scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++ ){
if(lef >= righ) { return ;
} int mid = lef + (righ - lef) / 2; reSeq(seq, lef, mid);
reSeq(seq, mid + 1, righ); int totalSize = righ - lef + 1; long long tmp[totalSize]; int n = lef; int m = mid + 1; int i = 0; while(n <= mid || m <= righ) {
输入
无输入
输出
按照饭量大小输出 3 人顺序,比如: ABC
样例输入

样例输出
无 #include<stdio.h>
#include<stdlib.h> int main(){
int A,B,C; int a,b,c; for(A=1;A<=3;A++){
for(B=1;B<=3;B++){ for(C=1;C<=3;C++){ a=((B>A)+(C==A)); b=((A>B)+(A>C)); c=((C>B)+(B>A)); if( ((A>B&&a<b)||(A==B&&a==b)||(A<B&&a>b)) + ((A>C&&a<c)||(A==C&&a==c)||(A<C&&a>c)) + ((B<C&&b>c)||(B==C&&b==c)||(B>C&&b<c)) ==3){ if(a>b&&a>c){ if(b>c) printf("ABC"); else printf("ACB"); } if(b>a&&b>c){ if(a>c) printf("BAC"); else printf("BCA"); } if(c>a&&c>b){ if(a>b) printf("CAB"); else printf("CBA"); }
int A=n,B=n/2,C=n/5;
for(i=0;i<=C;i++){
for(j=0;j<=B;j++){
for(k=0;k<=A;k++){
if(i*5+j*2+k*1==n){
printf("%03d%12d%12d%12d\n",t,k,j,i);
t++;
}
}
}
}
getchar();
return 0;
5、称体重
描述
赵、钱、孙、李四个人中既有大人也有小孩,给他们称体重时发现,他们每个人的体重都不一样, 且体重(单位:公斤)恰好是 10 的整数倍,且他们的体重都不高 于 50 公斤,已知赵、钱两人的 体重之和恰好等于孙、李两人的体重之和;赵、李两人的体重之和大于孙、钱两人的体重之和,并 且赵、孙俩人的体重之和还小于钱的体重。请编写一个程序,按照体重从小到大的顺序,打印出四 人的姓氏的首字母和体重数。
输入

输出
输出要求:按 ABCDE 的顺序输出 5 行,其中第 1 行是 A 的名次,第 2 行是 B 的名次, 第 3 行是 C 的名次,第 4 行是 D 的名次,第 5 行是 E 的名次。
样例输入
样例输出
源代码: #include<stdio.h> int main() {
printf("5\n"); printf("2\n"); printf("1\n"); printf("3\n"); printf("4\n"); return 0;
} } } } getchar(); return 0; }
7、求排列的逆序数
描述
在 Internet 上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计 他(或她)对各种不同信息的兴趣,从而实现个性化的服务。 对于不同的排名结果可以用逆序来评价它们之间的差异。考虑 1,2,…,n 的排列 i1,i2,…,in,如果 其中存在 j,k,满足 j < k 且?ij?> ik, 那么就称(ij,ik)是这个排列的一个逆序。
1、硬币面值组合
描述
使用 1 角、2 角、5 角硬币组成 n 角钱。 设 1 角、2 角、5 角的硬币各用了 a、b、c 个,列出所有可能的 a, b, c 组合。 输出顺序为:先按 c 的值从小到大,若 c 相同则按 b 的值从小到大。
输入
一个整数 n(1 <= n <= 100),代表需要组成的钱的角数。
输出
输出有若干行,每行的形式为: iabc
第 1 列 i 代表当前行数(行数从 001 开始,固定 3 个字符宽度,宽度不足 3 的用 0 填充),后面 3 列 a, b, c 分别代表 1 角、2 角、5 角硬币的个数(每个数字固定 12 个字符宽度,宽度不足的在 左边填充空格)。
样例输入
10
样例输出
if(m > righ || (n <= mid && seq[n] <= seq[m])) { tmp[i++] = seq[n++];
} else { tmp[i++] = seq[m++]; ans += mid - n + 1;
} } i = lef; for(int j = 0; j < totalSize; j++) {
现给定 1,2,…,n 的一个排列,求它的逆序数。
输入
第一行是一个整数 n,表示该排列有 n 个数(n <= 100000)。
第二行是 n 个不同的正整数,之间以空格隔开,表示该排列。
输出
输出该排列的逆序数。
样例输入
6 263451
样例输出
8
提示
1. 利用二分归并排序算法(分治); 2. 注意结果可能超过 int 的范围,需要用 long long 存储。 #include <cstdio> using namespace std; const int MAX_NUM = 100000 + 5; long long seq[MAX_NUM]; int N; long long ans; void reSeq(long long* seq, int lef, int righ) {//用 long long 存储,避免结果超过 int 的范围
001
10
0
0
002
8
1
0
003
6
2
0
004
4
3
0
005
2
4
0
006
0
5
0
007
5
0
1
008
3
1
1
009
1
2
1
010
0
0
2
源代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
int t=1;
int i,j,k;
int n;
scanf("%d",&n);
for(a[1]=1;a[1]<=5;a[1]++){ for(a[2]=1;a[2]<=5;a[2]++){ for(a[3]=1;a[3]<=5;a[3]++){ if((a[1]!=a[0]&&a[2]!=a[1]&&a[2]!=a[0]&&a[3]!=a[2]&&a[3]!=a[1]&&a[3]!=a[0]) &&(a[0]+a[1]==a[2]+a[3])&&(a[0]+a[3]>a[1]+a[2])&&(a[0]+a[2]<a[1])){ for(i=0;i<4;i++){ b[i]=a[i]; } }
相关主题