集训第三周

1:多组输入的处理方法有很多,一般都是!=EOF !=NULL;在循环里面加入if(n==0)break;如果是要以回车结束。用gets输入while(gets(str),str[0]);用scanf输入scanf("%c",&c);if(c!='\0');

2:sscanf()可用可用来分割类似的字符串;2006:03:18.sscanf("2006:03:18","%d:%d:%d",a,b,c);

3:100W内最大的素数999983;

4:判断雪花是否顺时针相同两层循环加个取余操作;以后做题,带有循环判断性质的想到取余。

如果是逆时针 改成b[(12-(i+j))%6];

for(i=0;i<6;i++)

{

  for(j=0;j<6;i++)

  {

    if(a[j] != b[(i+j)%6]);

  }

}

5:在用VC的时候如果for循环下面就一个语句我们很容易不加{}但是千万要看明白在那个地方右括号,因为他的对齐方式不一样,尤其是在写if判断的时候。抄别人的代码也得看清楚啊,老错多不好。

6:堆操作。

堆是一种特殊的二叉树,堆的意义在于最快的找到最大/最小值。堆得几种操作如下:
1:make_heap(Q,Q+m);其中Q是数组;
  把一串数组建成堆,时间复杂度为线性;
2:push_heap(Q,Q+m);
  用于将Q的最后一个元素加入堆中,并使整个区间成为一个新堆,注意前提是最后一个元素除外的所有元素已经是一个堆了。
3:pop_head(Q,Q+m);
  用于弹出区间的第一个元素,并把它放到区间的最后一个位置,然后重新将前面的元素建成堆。
4:is_heap();用于判断一个区间是否为一个堆,可以在push_heap之前使用,确保区间已经成为一个堆。
7:优先队列的用法:
  # include<queue>  
priority_queue<int> q1; //优先队列中的结点为整型数据。
优先队列默认数据大的优先级别高即:数据大的总是在对头,可以用pq.top()访问。
加入数据时也会对数据做动态的调整。
priority_queue<node> q2; //优先队列中的结点为自定义类node对象;
struct node
{
 friend bool operator< (node n1,node n2)
 {
  if(n1.a!=n2.a) return n1.a <n2.a;
  return n2.b<n1.b;
 }
 int a;
 int b;
}my[6];
priority_queue<int,vector<int>,greater<int>> q1;数据小的优先级高;
第二个参数为容器类型,第三个参数为比较函数。
priority_queue<int,vector<int>,less<int> > q2;数据大的优先级高。
8:a-z,A-Z个字符怎么存储,直接int a[100];a['a'],a['A'],来存储,这样转化成了int型,可以方便的进行数量统计,大小操作;此时数组的下标就代表是哪个字母,那么整形数组可以记录这些字母出现的个数。
字符串不一定都用%s输入,while(scanf("%c",c)&&c!='\n')也可以实现。
 9:二维字符数组全部初始化可不指定第一个下标:char str[][100]={"asdf","asdfa"};
这样代表只有两个数据,这种初始化也经常用到。
10:实型数四舍五入的做法:已知实型数a,那么它的四舍五入值。
int x=a;
if(a-x>=0.5)
  x=x+1;其中便保存了a的四舍五入的值,这是因为int是取整操作。
11: 在出现整形,实型混杂的题目中,一定要在整数后面添加0.00;
 

posted on 2013-08-19 18:24  随风浪子的博客  阅读(231)  评论(0编辑  收藏  举报

导航