ACM比赛资料.docx
- 文档编号:4380640
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:22
- 大小:25.92KB
ACM比赛资料.docx
《ACM比赛资料.docx》由会员分享,可在线阅读,更多相关《ACM比赛资料.docx(22页珍藏版)》请在冰豆网上搜索。
ACM比赛资料
Cstring使用说明
2014-08-1718:
21 28人阅读 评论(0) 收藏 举报
▪CString:
:
Left(intnCount)const;//从左边1开始获取前nCount个字符
▪CString:
:
Mid(intnFirst)const;//从左边第nCount+1个字符开始,获取后面所有的字符
▪CString:
:
Mid(intnFirst,intnCount)const;//从左边第nFirst+1个字符开始,获取后面nCount个字符
▪CString:
:
Right(intnCount)const;//从右边1开始获取从右向左前nCount个字符
注:
在函数后面加const的意思是:
如果一个类声明了一个常量对象,这个对象只能使用后边带const这个的方法.
例:
CStringa,b;
a="123456789";
b=a.Left(4);//值为:
1234
b=a.Mid(3);//值为:
456789
b=a.Mid(2,4);//值为:
3456
b=a.Right(4);//值为:
6789
在一个较大的字符串中查找字符或子字符串
▪intFind(TCHARch)const;(类似的还有ReverseFind,查看区别)
▪intFind(LPCTSTRlpszSub)const;
▪intFind(TCHARch,intnStart)const;
▪intFind(LPCTSTRpstr,intnStart)const;
返回值:
返回此CString对象中与需要的子字符串或字符匹配的第一个字符的从零开始的索引;如果没有找到子字符串或字符则返回-1。
参数:
ch要搜索的单个字符。
lpszSub要搜索的子字符串。
nStart字符串中开始搜索的字符的索引,如果是0,则是从头开始搜索。
如果nStart不是0,则位于nStart之前的字符不包括在搜索之内。
pstr指向要搜索的字符串的指针
例:
CString:
:
Find(TCHARch)
CStrings("abcdef");
intn=s.Find('c');//结果n=2
intf=s.Find("de");//结果f=3
人见人爱A-B
TimeLimit:
2000/1000MS(Java/Others) MemoryLimit:
65536/32768K(Java/Others)
TotalSubmission(s):
52902 AcceptedSubmission(s):
14903
ProblemDescription
参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法运算。
(当然,大家都知道集合的定义,就是同一个集合中不会有两个相同的元素,这里还是提醒大家一下)
呵呵,很简单吧?
Input
每组输入数据占1行,每行数据的开始是2个整数n(0<=n<=100)和m(0<=m<=100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B.每个元素为不超出int范围的整数,元素之间有一个空格隔开.
如果n=0并且m=0表示输入的结束,不做处理。
Output
针对每组数据输出一行数据,表示A-B的结果,如果结果为空集合,则输出“NULL”,否则从小到大输出结果,为了简化问题,每个元素后面跟一个空格.
SampleInput
33123147
372582345678
00
#include
#include
usingnamespacestd;
intmain()
{
inta[110],b[110],c[110];
intm,n;
inti,j,k;
intflag;
scanf("%d%d",&m,&n);
while(m!
=0||n!
=0)
{
k=0;
flag=0;
for(i=0;i scanf("%d",&a[i]); for(i=0;i scanf("%d",&b[i]); for(i=0;i { for(j=0;j if(a[i]==b[j]) break; if(j>=n) { c[k]=a[i]; k++; flag=1; } } sort(c,c+k); if(flag) { for(i=0;i printf("%d",c[i]); printf("\n"); } else printf("NULL\n"); scanf("%d%d",&m,&n); } return0; } 基于贪心算法的几类区间覆盖问题 分类: 贪心算法2014-10-0210: 39 54人阅读 评论(0) 收藏 举报 (1)区间完全覆盖问题 问题描述: 给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5] 解题过程: 1将每一个区间按照左端点递增顺序排列,拍完序后为[1,4],[2,4],[2,6],[3,5],[3,6],[3,7],[6,8] 2设置一个变量表示已经覆盖到的区域。 再剩下的线段中找出所有左端点小于等于当前已经覆盖到的区域的右端点的线段中,右端点最大的线段在加入,直到已经覆盖全部的区域 3过程: 假设第一步加入[1,4],那么下一步能够选择的有[2,6],[3,5],[3,6],[3,7],由于7最大,所以下一步选择[3,7],最后一步只能选择[6,8],这个时候刚好达到了8退出,所选区间为3 4贪心证明: 需要最少的线段进行覆盖,那么选取的线段必然要尽量长,而已经覆盖到的区域之前的地方已经无所谓了,(可以理解成所有的可以覆盖的左端点都是已经覆盖到的地方),那么真正能够使得线段更成的是右端点,左端点没有太大的意义,所以选择右端点来覆盖 (2)最大不相交覆盖 问题描述: 给定一个长度为m的区间,再给出n条线段的起点和终点(开区间和闭区间处理的方法是不同,这里以开区间为例),问题是从中选取尽量多的线段,使得每个线段都是独立的,就是不和其它有任何线段有相交的地方 样例: 区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5] 解题过程: 对线段的右端点进行升序排序,每加入一个线段,然后选择后面若干个(也有可能是一个)右端点相同的线段,选择左端点最大的那一条,如果加入以后不会跟之前的线段产生公共部分,那么就加入,否则就继续判断后面的线段 1排序: 将每一个区间按右端点进行递增顺序排列,拍完序后为[1,4],[2,4],[2,6],[3,5],[3,6],[3,7],[6,8] 2第一步选取[2,4],发现后面只能加入[6,8],所以区间的个数为2 贪心证明: 因为需要尽量多的独立的线段,所以每个线段都尽可能的小,对于同一右端点,左端点越大,线段长度越小。 那么为什么要对右端点进行排序呢? 如果左端点进行排序,那么右端点是多少并不知道,那么每一条线段都不能对之前所有的线段进行一个总结,那么这就明显不满足贪心的最有字结构了。 (3)区间选点问题 问题描述: 给定一个长度为m的区间,再给出n条线段和这n条线段需要满足的要求(要求是这n条线段上至少有的被选择的点的个数),问题是整个区间内最少选择几个点,使其满足每一条线段的要求. 样例: 略 解题过程: 将每个线段按照终点坐标进行递增排序,相同终点的前点坐标大的在前面,一个个将其满足 贪心证明: 要想使得剩下的线段上选择的点最少,那么就应该尽量使得已经选择了的点尽量能在后面的线段中发挥作用,而我们是从左往右选择线段的,那么要使得选取的点能满足后面线段的要求,那么必须是从线段的有端点开始选点,那么问题 (2)一样涉及到一个问题,如果是按照线段的左端点对线段进行排序的话,不知道右端点的话,每一条线段都不能对之前已经操作过的所有线段进行一个总结,那么这就同样不满足贪心算法的最优子结构性质了。 可以解决的实际问题: 数轴上面有n个闭区间[a,b],取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个) 会场安排问题—NYOJ14 分类: 贪心算法2014-09-2421: 18 49人阅读 评论(0) 收藏 举报 目录(? )[+] 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。 小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。 现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。 输入 第一行是一个整型数m(m<100)表示共有m组测试数据。 每组测试数据的第一行是一个整数n(1 随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei) 输出 对于每一组输入,输出最多能够安排的活动数量。 每组的输出占一行 样例输入 2 2 110 1011 3 110 1011 1120 样例输出 1 2 提示 注意: 如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始 /* 贪心问题,将结束时间从小到大排序,求满足条件的个数那一步处理的很精妙。 */ [cpp] viewplaincopy 1.#include 2.#include 3.#include 4.using namespace std; 5.struct Data 6.{ 7. int Bi; 8. int Ei; 9.}a[10010]; 10.int cmp(Data a,Data b) 11.{ 12. return a.Ei 13.} 14.int main() 15.{ 16. int m; 17. int n; 18. int i,j,sum; 19. scanf("%d",&m); 20. while(m--) 21. { 22. memset(a,0,sizeof(a)); 23. scanf("%d",&n); 24. for(i=0;i 25. scanf("%d%d",&a[i].Bi,&a[i].Ei); 26. sort(a,a+n,cmp); 27. for(i=1,j=0,sum=1;i 28. { 29. if(a[i].Bi>a[j].Ei) 30. { 31. sum++; 32. j=i; 33. } 34. } 35. printf("%d\n",sum); 36. } 37. return 0; 38.} /该题卡到我的问题是memset函数,一直不知道数组清空,导致问题无法正确解决。 另外algorithm头文件,sort库函数的使用非常方便。 returnab,则为降序 平顶山学院ACM官网上的题目。 两道题非常类似。 所以我重新编辑一下我的文章。 1110: 爱管闲事的晶晶 时间限制: 4Sec 内存限制: 128MB 提交: 93 解决: 33 [提交][状态][论坛] 题目描述 平顶山学院大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。 我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。 由于马路上有一些区域要用来建地铁。 这些区域用它们在数轴上的起始点和终止点表示。 已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。 现在要把这些区域中的树(包括区域端点处的两棵树)移走。 聪明的晶晶干了一件又一件事,她觉得这个很有意思,就想用计算机来帮助建筑工人统计这些树,现在任务来了,计算将这些树都移走后,马路上还有多少棵树。 输入 第一行是一个整数N表示有N组测试数据(1<=N<=100) 每组测试数据的第一行有两个整数: L(1<=L<=10000)和 M(1<=M<=100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。 接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。 输出 输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。 样例输入 15003150300100200470471 样例输出 298 [cpp] viewplaincopy 1.#include 2.#include 3.#include 4.using namespace std; 5.struct Data 6.{ 7. int Bi; 8. int Ei; 9.}a[10010]; 10.int cmp(Data a,Data b) 11.{ 12. return a.Bi 13.} 14.int main() 15.{ 16. int m; 17. int n,p; 18. int i,j,sum; 19. scanf("%d",&m); 20. while(m--) 21. { 22. memset(a,0,sizeof(a)); 23. scanf("%d%d",&p,&n); 24. for(i=0;i 25. scanf("%d%d",&a[i].Bi,&a[i].Ei); 26. sort(a,a+n,cmp); 27. sum = a[0].Ei - a[0].Bi+1; 28. for(i=1,j=0;i 29. { 30. if(a[i].Bi<=a[j].Ei) 31. sum = sum + (a[i].Ei-a[j].Ei); 32. else 33. sum = sum + a[i].Ei-a[i].Bi+1; 34. } 35. printf("%d\n",p+1-sum); 36. } 37. return 0; 38.} 39. setbuf setbuf是linux中的C函数,主要用于打开和关闭缓冲机制。 setbuf函数具有打开和关闭缓冲机制。 为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZ(定义在stdio.h头文件中)的缓冲区。 通常在此之后该流就是全缓冲的,但是如果该流与一个终端设备相关,那么某些系统也可以将其设置为行缓冲。 为了关闭缓冲,可以将buf参数设置为NULL。 功能: 把缓冲区与流相联 用法: voidsetbuf(FILE*steam,char*buf); [cpp] viewplaincopy 1.#include 2.char outbuf[50]; 3.int main(void) 4.{ 5./* 将outbuf与stdout输出流相连接 */ 6.setbuf(stdout,outbuf); 7./* 向stdout中放入一些字符串 */ 8.puts("This is a test of buffered output."); 9.puts("This output will go into outbuf"); 10.puts("and won't appear until the buffer"); 11.puts("fills up or we flush the stream.\n"); 12./* 以下是outbuf中的内容 */ 13.puts(outbuf); 14./*刷新流*/ 15.fflush(stdout); 16.return 0; 17.} 这种DP是相对容易的,一个二维数组,遍历一次,计算结果,存在指定位置。 本题关键代码是: a[i-1][j-1]=a[i][j]+a[i-1][j-1]; a[i-1][j-1]=a[i][j-1]+a[i-1][j-1]; 这是源代码: [cpp] viewplaincopy 1.#include 2.int main() 3.{ 4. int a[110][110]; 5. int s,n; 6. int i,k,j; 7. scanf("%d",&s); 8. while (s--) 9. { 10. scanf("%d",&n); 11. for (i=1;i<=n;i++) 12. { 13. for (j=1;j<=i;j++) 14. scanf("%d",&a[i][j]); 15. } 16. for (i=n;i>1;i--) 17. { 18. for (j=2;j<=i;j++) 19. { 20. //printf("%d ",a[i][j]); 21. if (a[i][j]>a[i][j-1]) 22. a[i-1][j-1] = a[i][j]+a[i-1][j-1]; 23. else 24. a[i-1][j-1] = a[i][j-1]+a[i-1][j-1]; 25. } 26. //printf("\n"); 27. } 28. /*for (i=1;i<=n;i++) 29. { 30. for (j=1;j<=i;j++) 31. printf("%d ",a[i][j]); 32. printf("\n"); 33. }*/ 34. printf("%d\n",a[1][1]); 35. } 36. return 0; 37.} 38. 将string转换成char* 分类: 基础算法2014-10-0516: 40 93人阅读 评论(0) 收藏 举报 string是c++标准库里面其中一个,封装了对字符串的操作 把string转换为char*有3中方法: 1.data 如: stringstr="abc"; char*p=str.data(); 2.c_str 如: stringstr="gdfd"; const char*p=str.c_str(); 3.copy 比如 stringstr="hello"; charp[40]; str.copy(p,5,0);//这里5,代表复制几个字符,0代表复制的位置 *(p+5)='\0';//要手动加上结束符 cout< 示例程序: #include #include usingnamespacestd; intmain() { stringline; getline(cin,line); charstr[20]; intsize=line.size(); line.copy(str,line.size(),0); //charstr[20]="liuyanbo"; charupper[20]; for(inti=0;i { //cout< upper[i]=static_cast } upper[i]='\0'; cout< return0; } error C2664: 'strcmp' : cannot convert parameter 1 from 'class std: : basic_string #include #inclu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 比赛 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)