A:判断熊象,六个参数,有4个是腿,必须一样,另外两个如果相同是象,不同是熊,不符合要求是喵星人!
B:给出几个数,将他们以不下降的方式排一下,若有三种及其以上排法,输出YES,然后任意输出三种排法(序号),有SPJ。
C:有n张牌,搭建房子,问有多少种可以搭出来的层数。
来张图吧!表示怎么搭,看不懂?GO HITTING ME!(来打我吖?)
我来一个20以内的表:01001,01101,10111,11111,没有能摆出2的,不要问我为什么。
D:给一个大墙(高度略参差不齐),然后再给一面小墙,往上拼接!
比如下图,答案就是2,同样不要问我为什么,看代码吧。
E:没读题。
题解:
A,B:略、
C:枚举每一层,看能不能得到,我代码里for每次循环都是一层,fr表示当前层数。
D:预处理+KMP。快速水过,代码写渣了,只需要对m==1特判一下,其它就是正常的裸KMP,来一发就过了。
E:233。
代码:按顺序是ABCD,大不了你去找样例跑一遍就知道哪题是哪题了。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int f[10],num[10]; int main() { // freopen("test.in","r",stdin); int i,j,k,flag=0; for(i=1;i<=6;i++)scanf("%d",&f[i]); sort(f+1,f+7); for(i=1;i<=6;i++) { if(f[i]==f[i-1]) { num[i]=num[i-1]; } num[i]++; if(num[i]==4) { flag=1; for(j=0;j<4;j++) { f[i-j]=0; } } } if(!flag) { printf("Alien\n"); return 0; } else { sort(f+1,f+7); if(f[5]==f[6]) { puts("Elephant"); } else puts("Bear"); } return 0; }
#include <cstdio> #include <cstring> #include <algorithm> #define N 2005 using namespace std; struct KSD { int x,f; bool operator < (const KSD& a)const { return x<a.x; } }s[N]; struct Syndra { int v,next; }e[N]; int head[N],cnt,num[N],visit[N]; int n,ans,m; void add(int u,int v) { cnt++; e[cnt].v=v; e[cnt].next=head[u]; head[u]=cnt; } int pre[N]; int ppp[N],star; void print(int x,int p) { int flag=0; if(x>m) { ans++; for(star=n;p;p=pre[p])ppp[star--]=s[p].f; for(star=1;star<=n;star++)printf("%d ",ppp[star]); puts(""); if(ans==3)exit(0); return ; } int i,v; for(i=head[x];i;i=e[i].next) { v=e[i].v; if(!visit[v]) { flag=1; visit[v]=1; pre[v]=p; print(x,v); visit[v]=0; } } if(!flag)print(x+1,p); } int main() { int i,j,k,flag=0; scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&s[i].x),s[i].f=i; sort(s+1,s+n+1); for(i=1;i<=n;i++) { if(s[i].x!=s[i-1].x)num[++m]=1; else num[m]++; if(num[m]>=3)flag+=2; if(num[m]==2)flag++; add(m,i); } if(flag<2) { puts("NO"); return 0; } else { puts("YES"); print(1,0); } return 0; }
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; long long n,sum,now,ans,fr; int main() { long long i,j,k; cin>>n; for(sum=now=2;sum<=n;now+=3,sum+=now) { fr++; if((n+fr)%3==0)ans++; } cout<<ans; return 0; }
#include <cstdio> #include <cstring> #include <algorithm> #define N 201000 using namespace std; int fix,a[N],pre[N],n,m,s[N],ans; int main() { // freopen("test.in","r",stdin); int i,j,k,x,y; scanf("%d%d",&n,&m); if (m == 1) { printf("%d\n", n); return 0; } if (n < m) { printf("0"); return 0; } scanf("%d",&x); for(i=1;i<n;i++) { scanf("%d",&y); a[i]=y-x;x=y; }n--; scanf("%d",&x); for(i=1;i<m;i++) { scanf("%d",&y); s[i]=y-x;x=y; }m--; s[m + 1] = 1 << 30; for(fix=0,i=2;i<=m;i++) { while(fix&&s[fix+1]!=s[i])fix=pre[fix]; if(s[fix+1]==s[i])fix++; pre[i]=fix; } for(fix=0,i=1;i<=n;i++) { while(fix&&s[fix+1]!=a[i])fix=pre[fix]; if(s[fix+1]==a[i])fix++; if(fix==m)ans++; } printf("%d\n",ans); return 0; }
好吧,其实我是来贴代码的,题解神马的根本就没好好写。
不爽?来打我吖?!!