ACM-1
一、高精度运算
Propram 1: X+Y , X-Y
Input file: t1.in Output file: t1.out Time limit: 3 seconds
You are given two integernumbers X and Y. Write a program to calculate X+Y and X-Y.
Input
The first line of the input file contains a single integer N, the number of test cases. The following N lines each contains two integers----X and Y ( 0 < X,Y <=10100 ).
Outpt
Print the value of X+Y, X-Y on a separate line.
Sample input and output
(参考程序见下页)
#include “stdio.h”
int x[50], y[50];
/****************** plus ****************/ void plus(int x[], int y[], int t)
{ int j, b=0, z[50];
for (j=0; j<=t; j++)
{ z[j]=(x[j]+y[j]+b);
b=z[j]/10000; z[j]=z[j]%10000; } if (b) { z[t+1]=b; t++; }
for(j=t; j>=0; j--) fprintf(fp2,”%d”,z[j]);
}
/************** minus ***************/ void minus(int x[], int y[], int t)
{ int j, z[50]; char flag;
if(x[t] for (j=0; j<=t; j++) { if (x[j] while (z[t]==0) t=t-1; for(j=t; j>=0; j--) fprintf(fp2,”%d”,z[j]); } /*************** main ****************/ void main() { int N, p, i, j, k, t; char s1[120], s2[120]; FILE fp1,fp2; fp1=fopen(“t1.in”,”r”); fscanf(fp1,”%d\n”,&N); for (p=1; p<=N; p++) { fscanf(fp1,”%s %s”,s1,s2); k=strlen(s1); t=(k+3)/4; for (i=0; i<=k-1; i++) { j=(k-i+3)/4-1; x[j]=x[j]*10+(s1[i]-…0?) ; } k=strlen(s2); for (i=0; i<=k-1; i++) { j=(k-i+3)/4-1; y[j]=y[j]*10+(s2[i]-…0?) ; } if(t<(k+3)/4)) t=(k+3)/4; plus(x,y, t); minus(x,y,t); } } 二、输出从N个物品中选M个的排列方案。 (主要程序段如下:) #define M 20 int a[M]; scanf(“%d %d”, &n,&m); t=1; do { a[t]=a[t]+1; if(a[t]>n) {a[t]=0; t--; continue;} for(j=1; j<=t-1; j++) if (a[t]= =a[j]) break; //判重if(j= = t) if(t else 输出a[1]---a[m] } } while (t>0); 三、输出从N个物品中选M个的组合方案。(主要程序段如下:) #define M 20 int a[M]; scanf(“%d %d”, &n,&m); t=1; do { a[t]=a[t]+1; if(a[t]>n) { t--; continue;} if(t else 输出a[1]---a[m] } } while (t>0); 四、走迷宫。 已知一个n*m的迷宫阵,其中0表示可通,1表示不同,编程输出一条从(1,1)走到(n,m)的路线。 五、八皇后问题。 在一个8*8的棋盘上放置八个皇后,使之不能互相攻击。几任两个皇后不能在同一行、同一列、同一个斜线。问共有多少种摆法。 (提示:) (1)若Q[T]=J 则表示第T个皇后放在第J列;T=1,…,8 (2)A[J]=0,表示当前第J列还没放皇后,A[J]=1;表示第J列已放有皇后;J=1,…,8 (3)B[X]=0,表示当前第X条左斜线还没放皇后,B[X]=1;表示第X条左斜线已放有皇后; X=2,……,16 (4)C[X]=0,表示当前第X条右斜线还没放皇后,B[X]=1;表示第X条右斜线已放有皇后; X=-7,……,7 void try(int i) { for(j=1; j<=8; j++); if(a[t]&& b[i+j] && c[i-j]) { q[i]=j; a[j]=b[i+j]=c[i-j]=1; if(i<8) try(i+1); else 输出数组Q方案; a[j]=b[i+j]=c[i-j]=0; //还原 } } 六、已知一个集合S,含有N个正整数,对给定的一个正整数X,求满足如下条件的所有子集 合:即子集合中的所有整数之和等于X。 例如:若S={5,2,3,10,15,7},X=15 , 则满足条件的子集为:{2,3,10} {5,10 },{ 15 } 七、有一个n*m的棋盘(n, m<=50)有一个中国象棋的”马”,“马”走的规则是: (1)马走“日”;(2)马只能向右走。 找出一条从(1,1)走到(n,m)最少步数的路线。若没有路,输出“NO”。 八、一个瓶中装有80毫升溶剂,实验时需要平分两份,但现在只有两个杯子,一个容量是50毫升,另一个容量是30毫升,编程:输出将溶剂分成两个40毫升的最少步骤。 九、零件加工问题 一台车床可以加工零件p1,p2,…,pi,但在同一个时刻只能加工一种零件。每个零件i在Si到Ei时刻被加工才能得到工钱ci。由于每个零件加工的时间可能冲突(注意:开始和结束时间相同不算冲突),所以不可能所有的零件都被加工。请选择一组合适的零件,使得工钱最多。只需求出最大工钱数。 数据样例: 3 (零件数,不超过100000) 1 3 10 (si, ei, ci) 4 6 20 2 5 25 样例输出: 30 十、超长数字串 给一个数字串S:1234567891011121314151617181920212223……它是由所有自然数从小到大依次排列起来的。任意给一个数字串S1,容易知道它一定在S中出现无穷多次。编程求出它第一次出现的位置。例如对于串“81”,它最先出现的位置是27。 输入文件仅一行,数字串S1。 Input.txt 81 Output.txt 27 四、路由选择问题 X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个源节点S传输到目标节点T的最短路径。遗憾的是,由于种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点。 任务一:求从给定的节点S到节点T的最短路径S1、第二最短路径S2。 任务二:在已知故障节点的情况下,求避开这些故障节点,从节点S到节点T的最短路径S3。 【输入文件】 T4.in 第1行:N S T (节点个数起始节点目标节点) 第2 ~ N+1行:S i1Si2 …S iN(节点i到其它节点的距离为S i j,j=1,2,……,N )最后一行:P T1T2……T p (故障节点的个数及编号) 【输出文件】T4.out S1S2S3(S1< S2 假设从节点S到节点T至少有两条不同的路径。) 【约束条件】 (1)N < 50 N个节点的编号为1,2,…,N (2)S ij为整数,0 【样例】 ①②* ③④ ⑤ 五、希望小学 地处偏僻山区的X乡有N个自然村,目前还没有一所小学,孩子们要么不上学,要么需要翻过一座座大山到别处上学。如今好啦,有一位热心人士准备捐款在X乡某个自然村建立一所希望小学。 通过调查发现,X乡各个村庄之间的道路较为复杂,有平路、上坡和下坡。考虑到每个村孩子们的人数不同,走上坡、下坡和平路的速度也不同,男孩和女孩走路速度也不同,请你为X乡选择一个最合适建立希望小学的村庄,使得所有的孩子花在路上的总时间最少。 【输入文件】 T5.in 第1行:N B1 B2 B3 G1 G2 G3 (村庄数、男孩分别走平路、上坡、下坡每千 米花费的时间以及女孩分别走平路、上坡、下 坡每千米花费的时间) 第2 行:X1 X2 ……Xn (Xi 表示第i个村要上学的男孩人数) 第2 行:Y1 Y2 ……Yn (Yi 表示第i个村要上学的女孩人数) 第3 行:K (道路数) 第4 ~ K+1行:Ai Bi Si1 Si2 Si3 (村庄Ai到村庄Bi,平路Si1千米,上坡Si2千 米,下坡Si3千米) 【输出文件】T5.out T (将要建立希望小学的村庄编号) 【约束条件】 (1)N < 30 ,Xi < 20 ,Yi < 20 (2)K < 100 ,每条路的长度< 30千米 (3)B1,B2,B3,G1,G2,G3为整数,都小于10个单位时间/ 每千米 (4)每条道路只给出一组数据。例如:5 8 7 10 3 表示从村庄5往村庄8走,平路有7千米,上坡10千米。下坡3千米;当然也表示从村庄8往村庄5走,平路有7 千米,上坡3千米。下坡10千米。 【样例】 ① 7 2 1 3 ②