Codeforces Round #151 (Div. 2)笔记
今天应该算第一次开始做CF,把当时没搞出来的题目总结一下吧
题意:
给N个互不相同的数字,要组成M(M<=N*(N+1)/2)种不同的SUM,要求输出每种组成的方法.
错误思路:
比赛的时候没有注意M的数据范围...结果居然写了个深搜...OMG,这明显要超时的节奏啊,没想到交上去以后样例居然过了,看来比赛中的样例M是不够大啊...不过中途还是被某个牛人hack掉了- -。
正确思路:
注意到M的范围很重要,因为一共有N个数字,假设现在要一个L个人的组合,那么可以固定L-1个人(直接取最后L-1个人就好了,很方便),剩下的N-L+1个人依次可以和这L-1个人组合,得到一个人数为L的SUM,这样可以保证人数为L的组合的SUM是没有重复的,现在我们再加入一个排序,让数组是从小到大排列的,这样一来,由于每次都取数组最后的几个数,而L+1个人的组合比L个人的组合多一个人,也就是L+1组成的SUM一定大于L个人组成的SUM,这样确保了唯一性,且正好能得到N*(N-1)/2种情况.
代码:
View Code
#include<stdio.h> #include<stdlib.h> int va[60]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int main() { int n,k,i,j,ll; while(scanf("%d%d",&n,&k)!=EOF) { for(i=1;i<=n;i++) { scanf("%d",&va[i]); } qsort(va+1,n,sizeof(va[0]),cmp); for(i=0;i<n;i++) { if(k==0)break; for(j=1;j+i<=n;j++) { if(k==0)break; printf("%d",i+1); for(ll=n;ll>n-i;ll--) { printf(" %d",va[ll]); } printf(" %d\n",va[j]); k--; } } } return 0; }
题意:
给你N个点和M条边,每个点有一个颜色,每个颜色的价值=与这个颜色的点相邻的不同颜色的个数.
错误思路:
这个思路已经不用说了吧...大家都知道的...把每个颜色相邻的颜色都记录下来,然后排序判重...当时读题的时候C题被黑掉了,直接导致D题看得太快理解错了题意,最后就没时间搞了.这题着实是亏大了ToT.
正确思路:
同上,详见代码,不过要特别注意每个颜色的相邻颜色都是本身的情况需要特判.
View Code
#include<stdio.h> #include<stdlib.h> struct node { int x,y; }seg[210000]; int va[110000]; int cmp(const void *a,const void *b) { if((*(node *)a).x==(*(node *)b).x) return (*(node *)a).y-(*(node *)b).y; else return (*(node *)a).x-(*(node *)b).x; } int cmp2(const void *a,const void *b) { return *(int *)a-*(int *)b; } int main() { int n,m,temp1,temp2; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&va[i]); } int cnt=0; while(m--) { scanf("%d%d",&temp1,&temp2); if(va[temp1]!=va[temp2]) { seg[cnt].x=va[temp1]; seg[cnt++].y=va[temp2]; seg[cnt].x=va[temp2]; seg[cnt++].y=va[temp1]; } } qsort(seg,cnt,sizeof(seg[0]),cmp); int max=0,ans=0,count=0; for(int i=0;i<cnt;i++) { if(seg[i].x==seg[i+1].x&&seg[i].y!=seg[i+1].y) count++; else if(seg[i].x!=seg[i+1].x) { count++; if(count>max) { max=count; ans=seg[i].x; } count=0; } } if(max==0) { qsort(va+1,n,sizeof(va[0]),cmp2); printf("%d\n",va[1]); } else printf("%d\n",ans); } return 0; }