从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题的,尽管可能会面临很多失败。