ACM_ACM入门帖2_HOW to be an ACMer

本文介绍了ACM程序设计竞赛的基本情况及参赛准备要点,包括必备素质、注意事项、学习内容等方面,帮助有意向参赛的学生快速入门。


HOW to be an  ACMer??


ACM_ACM_入门帖2_HOW to be an ACMer - Essence - ACM_Of_Essence
 

转自:http://blog.csai.cn/user1/44812/archives/2008/24255.html
 


一.ACM队员的成长模式
讲座+训练
说明:      
    1.讲座:
 每一年,我们天大ACM都是以讲座的方式由老队员向大家(由指想参加ACM的新人)讲述由关ACM的
各方面内容,带领大家入门.所以,对于新人,听讲座是很重要的,这会让你逐步了解很多很多的
与ACM有关的东西.
 2.训练:训练是ACM最为重要的一部分,包括平时的个人训练和暑期的集训,这真正是你提高的最核
心的一部分,我们ACM所要求的就是编程实战能力.所以,想参加ACM比赛的同学,从现在开始,必须进行相关的
平时个人训练,包括看一些书籍,做一些题目等等

二. 做一个ACMer所必备素质
1.对编程有浓厚的兴趣;
2.有毅力,有恒心;
3.有能吃苦的决心和勇气;
4.有团队协作的精神(有别与NOI);
三.做一个ACMer值得注意的地方
1.ACM学习和训练完全都是个人自学提高的一个过程.所以,个人主动性很关键;

2.一定要学会善于总结和积累经验.最好是有一个能够便于让你总结的平台,最好就是有一个blog,作为自己ACM成长的总结的地方.
3.要学会与外界各兄弟院校的同学进行这方面的沟通和认识,即要开拓思想,相互学习;

4.要学会与队友之间进行沟通,合作,也即是要有一种团队精神;
四.进行ACM所需要学习的内容(概要)
1.数学 (如:组合数学、具体数学)

2.数据结构(包括高级数据结构)

3.算法 (如:贪心算法,Floyd, prim等)
五.ACM能给你带来哪些收获
1.数据结构和算法方面会有明显的提高,对于一个算法不再只是停留在书本理论上的理解和认识,更有着实践中的体验,
对所谓的WA, TLE, RE,MLE,PE,OLE会有着很深的印象和体验;

2.能让你的英语水平有所提高,同时敲代码的能力和速度有明显的提高;
3. 能让你结识很多人;


4. 参加ACM比赛,代表天大出去比赛,能够让你亲身感受一下外面世界。

5. 懂得了做一门学问和研究所需要的方法和步骤,其实ACM从某种程度上讲,是一门研究过程,所涉及的领域非常的广。

什么是 ACM/ICPC?
    ACM (Association for Computing Machinery)
  成立于计算机诞生次年,是目前计算机学界中历史最悠久、最具权威性的组织…
    ACM/ICPC (ACM International Collegiate Programming Contest, 国际大学生程序设计竞赛)是由国际计算机界历史悠久、
颇具权威性的组织 ACM (Association for Computing Machinery,国际计算机协会) 主办的,世界上公认的规模最大、水平
最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自己分析问题和解决问题的能力。该项竞赛从 1970 年
举办至今已历 29 届,一直受到国际各知名大学的重视,并受到全世界各著名计算机公司的高度关注,在过去十几年中,
APPLE、AT&T、MICROSOFT 和 IBM 等世界著名信息企业分别担任了竞赛的赞助商。可以说,ACM 国际大学生程序设计竞赛已成为世界
各国大学生最具影响力的国际级计算机类的赛事, 是广大爱好计算机编程的大学生展示才华的舞台,是著名大学计算机教育成果的直
接体现,是信息企业与世界顶尖计算机人才对话的最好机会。

该项竞赛分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的 3~4 月举行,
而区域预赛安排在上一年的 9~12 月在各大洲举行。


本类输入解决方案:
C语法:
 while(scanf("%d %d",&a, &b) != EOF)
 {     .... }

C++语法:
 while( cin >> a >> b ) {    .... }
Scanf函数返回值就是读出的变量个数,如:scanf( “%d  %d”, &a, &b );
  如果只有一个整数输入,返回值是1,如果有两个整数输入,返回值是2,
如果一个都没有,则返回值是-1。
EOF是一个预定义的常量,等于-1。

 

输入一开始有一个N,表示有N个Case,下面接着是这N个Case的具体情况:
C:    c++:
scanf("%d",&n);   cin>>n;
for(i=0;i<n;i++)  for(i=0;i<n;i++)
{}

    {}
不说明有多少个Case,直接以某个特定的标志作为结束(比如0)
while(1)
{
cin>>n;//c:scanf("%d",&n)
if(n==0)break;
}


不明确说明结束标志,或者一直国处理到end of file
C:
 while( scanf(“%d %d”, &n, &m) != EOF )  {
 ……
 }
如果是按行读入:
 char  str[100];
 while( gets(str) != NULL ) { …… }

C++:
 while( cin>>n>>m )  {
 ……
}

本类输入解决方案:
C语法:
   char buf[20];  gets(buf);
 
C++语法:
 如果用string buf;来保存:
   getline( cin , buf );
 如果用char buf[ 255 ]; 来保存:
  cin.getline( buf, 255 );

scanf(“ %s%s”,str1,str2),在多个字符串之间用一个或多个空格分隔;
若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。
通常情况下,接受短字符用scanf函数,接受长字符用gets函数。
而getchar函数每次只接受一个字符,经常c=getchar()这样来使用。


cin.getline的用法:
getline 是一个函数,它可以接受用户的输入的字符,直到已达指定个数,或者用户输入了特定的字符。它的函数声明形式(函数原型)如下:
 istream& getline(char line[], int size, char endchar = '\n');
不用管它的返回类型,来关心它的三个参数:
char line[]: 就是一个字符数组,用户输入的内容将存入在该数组内。
int size : 最多接受几个字符?用户超过size的输入都将不被接受。
char endchar :当用户输入endchar指定的字符时,自动结束。默认是回车符。
结合后两个参数,getline可以方便地实现: 用户最多输入指定个数的字符,如果超过,则仅指定个数的前面字符有效,如果没有超过,则用户可以通过回车来结束输入。
char name[4];
cin.getline(name,4,'\n');
由于 endchar 默认已经是 '\n',所以后面那行也可以写成:
cin.getline(name,4);

 

 

C/C++ Tips
数据范围:
 char    -128 ~ +127  (1 Byte)
 short    -32767 ~ + 32768 (2 Bytes)
 unsigned short  0 ~ 65536  (2 Bytes)
 int    -2147483648 ~ +2147483647   (4 Bytes)
 unsigned int   0 ~ 4294967295 (4 Bytes)
 long 同int
 long long   -9223372036854775808 ~
    +9223372036854775807 (8 Bytes)
 double   1.7  *  10^308  (8 Bytes)

1,一般不需要用long
2,浮点数一律使用double,不要用float


Complexity Analysis 复杂度分析
时间复杂度:程序的执行步数执行了多少次基本操作
空间复杂度:程序占用的内存堆栈空间与变量空间


示例1:查找数组a中的最大值
int max;
 for(i = 0; i < n; i++){
 if(a[i] > max) max = a[i];
 }


示例2: 冒泡排序
for(i = 0; i < n; i++)
{
 for(j = 0; j < n-i-1; j++)
 {
  if(a[j] < a[j+1])
  {
  swap(a[j], a[j+1]);
  }
 }
}


渐近分析,符号(О,Ω,Θ)
计算机科学使用最多的符号-讨论算法时使用的共同语言.
f(n)=O(g(n)) if 存在正常数c和n0使得对所有n>n0 有f(n)<cg(n) 成立.
Limn->∞f(n)/g(n)=c,  0≤c<∞,则
                f(n)=O(g(n))
10n2+3n+100=O(n2),lim=10;
1000n2=O(n2.1),lim=0
称g(n)为f(n)的渐近上界(Asymptotic Upper Bound).
约定O(1)代表常数.
g(n)常取一些简单的初等函数,nk,log2n
和nklog2n等:

 


如何排序
#i nclude <algorithm>
 using namespace std;
对数组a[N]进行从小到大排序:
 sort(a, a+N);
用法举例:
1.从小到大排序(int, double, char, string, etc)
const int N = 5;
int main()
{
 int a[N] = {4,1,2,5,3};
 string str[N] = {“YES”,”NO”,”C++”,”TJU”,”BBS”};
 sort(a,a+N);
 sort(str,str+N);
 return 0;
}
2.从大到小排序(需要自己写cmp函数)
const int N = 5;
int cmp(int a,int b) {return a > b;}
int main()
{
 int a[N] = {4,1,2,5,3};
 sort(a,a+N,cmp);
 return 0;
}
3. 对结构体排序
struct SS {int first,second;};
int cmp(SS a, SS b) {
 if (a.first != b.first) return a.first < b.first;
 return a.second < b.second;
}
v.s. qsort() in C (平均情况O(nlogn),最坏情况O(n^2))
int cmp(const void *a, const void *b) {
 if (((SS*)a)->first != ((SS*)b)->first)
  return ((SS*)a)->first – ((SS*)b)->first;
 return ((SS*)a)->second – ((SS*)b)->second;
}
qsort(array,n,sizeof(array[0]),cmp);


ACM_ACM_入门帖2_HOW to be an ACMer - Essence - ACM_Of_Essence
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值