从8月27日开始,由于开学各种忙活,也少有时间训练了。今天趁着下午第一节空课,到训练室参加了杭电的广西省省赛网络赛,也是练练手,因为这几天一直没碰代码。。。
由于有一个小伙伴被叫去开会,本来准备三人组队的比赛也变成了两个人。刚开始做的时候看到有人几秒钟就把题AC了。有点懵逼,可能他们之前做过广西省的省赛吧。
因为手有点生,一开始有很多细节想不出来,小伙伴淡定的睡了一会儿之后,起来就1A了两个题。。。虽然都是水题(两个都是暴力就能解),但是换我就不一定做得出来。。。我一直在研究一个题,就是广西赛邀请赛中的 Duizi and Shunzi,题意就是给你一个序列,让你从中找三个连续的数组成一个顺子,或者找两个相同的组成一个对子,看最多能找出几个。
我的思路是直接贪心,用数组a存数i出现了a[i]次,然后从1开始算。具体贪心是以找对子为主,先直接找1和2能组成的对子数,然后a[1]和a[2]对2取余。然后从第三个开始枚举,如果能和前面组成顺子就记一个,然后三个数的数目都减一。然后把这个数取对子,看能取几个,再对2取余。因为优先取顺子的情况只有一种,比如123345。这样就可以避免这种情况,注意判断三个数的数目出现负数的情况,因为在这里没注意到减为负数,我WR了7次。虽然是一道签到题,但是对于非常菜的我来说,能A就很高兴了。。。AC代码如下:
#include<iostream> #include<cmath> #include<string> #include<string.h> #include<algorithm> #include<queue> #include<vector> #include<cstdio> #include<map> #include<cstdio> using namespace std; const int mx=1010; const int inf=0x7fffffff; const double PI=acos(-1.0); int max(int x,int y){if(x>y)return x;return y;} int min(int x,int y){if(x<y)return x;return y;} struct node{ int x,l,w,c; bool operator<( const node &a ) const { return x<a.x||(x==a.x&&l<a.l);} }aa[10010],o; int a[1000010]; int j,k,s,e,x,t,y,z,n,m,mm,i,f,sum,ans; int main() { //ios::sync_with_stdio(false); int L,N,B; int flag; while(scanf("%d",&n)==1) { memset(a,0,sizeof(a)); sum=0;i=n;ans=0; while(i--) {scanf("%d",&m);a[m]++;} sum=(a[1]/2+a[2]/2); a[1]%=2;a[2]%=2; for(i=3;i<=n;i++) { if(a[i-2]>0&&a[i-1]>0&&a[i]>0) {sum++;a[i]--;a[i-1]--;a[i-2]--;}//注意判断必须大于零 sum+=a[i]/2; a[i]%=2; } printf("%d\n",sum); } return 0; }
好像和题解的思路基本相同,不过没用什么高大上的写法。。。
马上就要开始看线段树了,看着一大堆作业我也是无奈啊。。。尽量学习吧,尽力不落下。。。
知识越不练习,就会越来越不会。。。以后也要常做题巩固一下知识。
这几天的情况基本就是这样吧,也基本没做题,明后天涉及新生开学还会有一些事,不过我会依然坚持学习,努力A题的,尽管可能会面临很多失败。