ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:24.46KB ,
资源ID:4093727      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4093727.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ACM必做50题的解题模拟.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ACM必做50题的解题模拟.docx

1、ACM必做50题的解题模拟POJ 1029 False coin Slyar:又是假币判断问题,跟POJ1013类似,不过这个题用1013那个算法WA了.后来换了种枚举的算法才过.思路就是假币应该在每个不等式中都出现,最后只要看哪个硬币出现的次数和不等式出现的次数相同,如果这个硬币唯一,那它就是确认的假币。#include #include using namespace std; const int MAX = 1001; int main() int n, k, p, total = 0; char sign; /* 记录原始数据 */ int tMAX = 0; /* 标记硬币真假 */

2、 int rMAX = 0; /* 记录硬币重量 */ int wMAX = 0; cin n k; while (k-) /* 读入原始数据 */ cin p; for (int i = 0; i ti; cin sign; /* 标记肯定为真的硬币 */ if (sign = =) for (int i = 0; i 2 * p; i+) rti = 1; /* 左轻右重 */ else if (sign = ) total+; for (int i = 0; i p; i+) wti-; for (int i = p; i ) total+; for (int i = 0; i p; i

3、+) wti+; for (int i = p; i 2 * p; i+) wti-; /* 假币在不等式中每次都应该出现 */ int count = 0, pos = 0; for (int i = 1; i = n; i+) if (ri) continue; /* 找出每次都出现的假币 */ if (wi = total | wi = - total) count+; pos = i; poj 1013 Counterfeit Dollar关于称硬币的问题: 此题中赛利已经设计了正确的称量方案,保证从三组称量数据中能得到唯一的答案。答案可以用两个变量表示:x假币的标号、w假币是比真币轻

4、还是比真币重。x 共有12 种猜测;w 有2 种猜测。根据赛利设计的称量方案,(x,w )的24 种猜测中,只有唯一的猜测与三组称量数据都不矛盾。因此,如果猜测(x,w )满足下列条件,这个猜测就是要找的答案:l 在称量结果为even 的天平两边,没有出现x ;l 如果w 表示假币比真币轻,则在称量结果为up 的天平右边一定出现x、在称量结果为down 的天平左边一定出现xl 如果w 表示假币比真币重,则在称量结果为up 的天平左边一定出现x、在称量结果为down 的天平右边一定出现x具体实现时,要注意两点:1) 选择合适的算法对于每一枚硬币x 逐个试探:l x 比真币轻的猜测是否成立?猜测成

5、立则进行输出。l x 比真币重的猜测是否成立?猜测成立则进行输出。2) 选择合适的数据结构以字符串数组存储称量的结果。每次称量时,天平左右最多有6 枚硬币。因此,字符串的长度需要为7,最后一位存储字符串的结束符0,便于程序代码中使用字符串操作函数。char left37, right37, result37;#include #include char left37, right37, result35; int islight( char x ) int i; for ( i = 1; i = 3; i+ ) switch( resulti0 ) case u: if( strchr(rig

6、hti, x) = NULL ) return 0; break; case e: if(strchr(righti, x) != NULL | strchr(lefti, x) != NULL) return 0; break; case d: if(strchr(lefti, x) = NULL) return 0; break; return 1; int isheavy( char x ) int i; for ( i = 1; i =3; i+ ) switch( resulti0 ) case u: if( strchr(lefti, x) = NULL) return 0; br

7、eak; case e: if(strchr(righti, x) != NULL | strchr(lefti, x) != NULL) return 0; break; case d: if(strchr(righti, x) = NULL) return 0; break; return 1; int main() int i,j,n; char c; scanf(%d,&n); while(n-) for(i=1; i=3; i+) scanf(%s %s %s,lefti,righti,resulti); for(c=A; c=L; c+) if(islight(c) printf(

8、%c is the counterfeit coin and it is light.n,c); break; if(isheavy(c) printf(%c is the counterfeit coin and it is heavy.n,c); break; return 0; /* 假币唯一则输出 */ if (count != 1) cout 0 endl; else cout pos endl; /system(pause); return 0; poj 1083 Moving Tables就是把这400个房间分成200分,1-2,3-4,。每次移动时,都要把经过的“份”算上,这样

9、最后找份中最大的那个数即可#include #include #include #define SIZE 220using namespace std;void swapnum(int &a,int &b);int getindex(int k);int main () int t,n; cint; while(t-) cinn; int x,y; int crossSIZE; memset(cross,0,sizeof(cross); for(int i=0;ixy; int start,end; if(xy) swapnum(x,y); start=getindex(x); end=get

10、index(y); for(int i=start;i=end;+i) crossi+; int maxnum=INT_MIN; for(int i=0;icrossi?maxnum:crossi; coutmaxnum*10=q的人有空的话,把人数跟i记录下来,放在结构体数组里,最后按人数从大到小排序,如果最大的那个的人数q的话输出0,否则就是最大的那个,还要日子靠前的那个。 Max是这么多人的有空的日子里最晚的那天,#include #include #include #define N 55#define M 105typedef struct int index; int count;

11、item;item itemsM;int cmp(const void *p, const void *q) return (*(int *)p) - (*(int *)q);int cmp2(const void *p, const void *q) item *a = (item *)p; item *b = (item *)q; if(a-count b-count) return -1; else if(a-count count) return 1; else return a-index b-index ? 1 : -1; int main() int i, j, k; int s

12、ize, quorum, dateNum, result, count, max; int datesNM; int *find; while(scanf(%d%d, &size, &quorum) & size & quorum) memset(dates, 0, sizeof(dates); memset(items, 0, sizeof(items); max = 0; for(i=0; isize; i+) scanf(%d, &datesi0); for(j=1; j=datesi0; j+) scanf(%d, &datesij); if(max datesij) max = da

13、tesij; for(i=1, k=0; i=max; i+) for(j=0, count=0; j= quorum) itemsk.count = count; itemsk.index = i; k+; if(count = size) break; qsort(items, k, sizeof(items0), cmp2); if(items0.count = quorum) printf(%dn, items0.index); else printf(0n); return 0;poj 2234 Matches Game 异或的问题不是很理解,没办法强记策略尼姆博奕(Nimm Gam

14、e):有n堆各若干个物品,两个人轮流从某一堆取任意多(或者最多m个,只需把每堆%m)的物品,规定每次至少取一个,多者不限,最后取光者得胜。把每堆数量求异或a1a2.ai.an,结果为零。则先手必输,否则必赢。#include using namespace std;int main() int n,ans,temp; while(scanf(%d,&n) != EOF) scanf(%d,&ans); n-; while(n-) scanf(%d,&temp); ans = temp; if(ans) printf(Yesn); else printf(Non); return 0;poj 1

15、067 取石子游戏有两堆石头,一次可以取走其中一堆的任意个石头 或者在两堆中取走相同数量的石头。现在两个人相互比赛,谁最后没有石头取则视为输家。输入两堆石头的数目让你判断,若是双方都按照最优原则取,谁会是赢家。 开始以为是一个贪心算法。实际上错了。这个题目主要讲的是一个数学定理,说白了就是一个贝蒂定理。描述如下: 1.alpha,beta0 2.1/alpha+1/beta=1则alpha*n,beta*n能够成正整数集的一个划分。这个题目中: alpha=(1+sqrt(5)/2; beta=(3+sqrt(5)/2;代码写的不算漂亮,有几处细节:1:sprt函数的输入要么是浮点型要么是do

16、uble型,所以输入要写成5.0,而自己长期以来用整形数习惯了。这个地方出现了编译错误。2:cmath库中还有ceil和swap函数,还有点意外,之前以为要自己写。3:Rbig=(int)beta*n; Rsmall=(int)alpha*n;之前我是这样写的,但是结果却错了。原因是这样写会将alpha,beta强制转换。而不是将整个相乘的结果转换成整数。#include iostream#include using namespace std; int main(int argc, char* argv) int n; int max,min; int Rbig,Rsmall; double

17、 alpha=(1+sqrt(5.0)/2; double beta=(3+sqrt(5.0)/2; int m=8; while (cinmaxmin) if (maxmin) swap(max,min); n=ceil(max/beta); Rbig=/*(int)*/beta*n; Rsmall=/*(int)*/alpha*n; if (Rbig=max&Rsmall=min) cout0endl; else cout 1endl; return 0;POJ 1012 Joseph约瑟夫问题都知道了,这个题就是给出一个k,总人数n等于2k,让你找到一个报数m,使得后k个人先出列.反正k

18、才到14,暴力枚举就行了,不过由于数据比较多,需要开一个数组保存一下才不会超时.#include #include using namespace std; int work(int, int); int main() int i, k; vector array(14); for (k = 1; k k; if (k = 0) break; cout arrayk k) i = (i + m - 1) % len; if (i 4 - 7 -1对于第二个字符,加密2次的结果如下:2 - 5 - 2可以看到,加密一定次数后,结果会构成一个循环,如果我们求出这个循环周期,那么加密的次数就可以使用

19、取余运算进行缩减了。这次没有使用C+来做,因为gets和puts很好用,而String在这里发挥不出什么作用.#include #include #include #define MAX 202 int keyMAX, tMAX; /* 求解置换周期 */void get_time(int n) int i, j, count; for (i = 1; i = n; i+) j = keyi; count = 1; /* 直到轮回 */ while(i != j) count+; j = keyj; ti = count; int main() int i, j, m, n, len; cha

20、r srcMAX, dstMAX; while(1) scanf(%d, &n); if (n = 0) break; for (i = 1; i = n; i+) scanf(%d, &keyi); /* 初始化周期数组 */ memset(t, 0, sizeof(t); get_time(n); while(1) scanf(%d, &m); if (m = 0) break; getchar(); /* 读入输入串 */ gets(src + 1); /* 补全输入串 */ for (i = strlen(src + 1) + 1; i = n; i+) srci = ; srcn +

21、 1 = 0; /* 求解输出串 */ for (i = 1; i = n; i+) int pos = i; for (j = 0; j m % ti; j+) pos = keypos; dstpos = srci; dstn + 1 = 0; puts(dst + 1); printf(n); /system(pause); return 0;POJ 1068 Parencodings这道题目是一道模拟题。P-sequence表示第i个)之前有几个(,W-sequence表示第i个()包含几对(),要求对应P的W。题目中没有要输出S,故()可以分别用0,1来代替。根据P可以轻易知道)的位置:location = pi + i。用value记录wi的值,用flag记录括号是否成对。#include#include#include int t,n; int s41,p21,w21; int main() scanf(%d,&t); while(t-) scanf(%d,&n); int temp,flag,value; memset(s,0,sizeof(s); for(int i = 0;i = 0;-k) if(sk = 0 & flag = 0) wi = value; break; else if(sk = 1) value+; flag+; else if(sk

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1