1、 题意:n个人淘汰赛,两个人可以比赛的条件是:两人打过的场数之差绝对值<2。求冠军最多可以打多少场。 总结:看了题解,转换一下思路。求n个人最多打几场 -> 打x场最少要几个人。 要最少,则f[x]=f[x-1]+f[x-2](即和打了x-1场和x-2场的胜者打)。然后对n二分就行。 注:很巧妙,变成fibonacci了。
2、 题意:请客可容总量w,每个人量wi、魅力值bi。特殊在有朋友圈,同一朋友圈中人要么全来,要么只来一个。求最大魅力值。 总结:背包。但,要么来一个,不太好处理。不会
3、 题意:圣诞树发奖,n个结点n-1条边连成树,通过结点1挂在墙上,两个人任取两个结点剪断所连边,要使掉下的结点权值和s1,s2相加最大。如s1,s2必须有重合结点,输出"Impossible"。 总结:不好判断是否有重合结点。不会
4、 题意:n个点其中k个基点,一个连通分量中只有一个基点称为稳定图。给出m条已有边,问在保证稳定的前提下,最多可加几条边。 总结:并查集,往含有基点且结点最多的连通分量中加边即可,水。
5、 题意:列车在0到s(s>=2)内走动,人可坐列车,车、人分别一米走t1,t2秒,问人从x1到x2最短时间。 总结:好坑的模拟题,WA了4发才过,还看了数据。有很多细节的地方,有时间再做一遍。 注:用数组代替模拟的,感受更简单一点,但也有地方要注意。
/*题目注意:不一定只在整数点坐上列车; s>=2; s,x1可以重合。*/#includeusing namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define F(i,a,b) for (int i=a;i =t2) { cout<<(abs(x1-x2)*t2)< =ta[x2]) break; if(i==0 || i==s) d=-d; } if(ta[x2]<=ans) cout< <
6、 题意:a个G,b个B,一排输出,最多连续k个相同的,任意输出可能序列。 总结:水。但有个点傻了一下。 int a,k,b;(1至1e5) if((a+1)*k<b) { puts("No"); } 注意:会爆int,(a+1)*k溢出。
7、 好水的题,直接暴力过了。。好气啊,怎么当时比赛的时候就没过呢
8、 题意:n天温度ti,ti<0必须用冬天轮胎,ti>=0夏天、冬天轮胎都可。一开始用夏天轮胎,结尾随便用哪种轮胎,问最少换几次轮胎。 总结:模拟题,记得综测时挂了一大片,好坑,有时间再做一遍。
//尤其注意,结尾随便用哪种轮胎都可#includeusing namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define F(i,a,b) for (int i=a;i k) { cout<<-1< =0) { if(t[i-1]<0) num=1; else num++; } else { if(t[i-1]>=0) ns[tot++]=num; } } k-=sum; int nsen=0, ans=tot*2+1; if(t[n]>=0) nsen=num, ans+=1; sort(ns,ns+tot); FF(i,0,tot-1) { if(k-ns[i]>=0) k-=ns[i], ans-=2; else break; } if(nsen>0 && k-nsen>=0) k-=nsen, ans-=1; cout< <
9、 先空着