NOIP2017模拟赛R1 出题人李昌栋 这套题其实还是很好(暴)的(力) T1 正解DP,次解贪心,贪心不是挺好的嘛? 就是用两个whilie判断最长序列的结束端,然后从结束端+1继续while继续寻找最长序列#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 100000 #define INF 2147483647 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } int n,a[Maxn+1],x,y,ans; int main(){ qread(n); for(int i=1;i<=n;i++)qread(a[i]); ans=0; for(int i=1;i<=n;i++){ x=y=i; while(x<n&&a[x+1]>=a[x])x++; while(y<n&&a[y+1]<=a[y])y++; i=std::max(x,y); ans++; } printf("%d\n",ans); }T2 正解变换前后数字奇偶性不变,利用这种性质直接运算就好#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(y) y=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Mayn 100000 #define INF 2147483647 inline int read(){ char ch=getchar(); int f=1,y=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){y=y*10+(ch-'0');ch=getchar();} return y*f; } int n,m,x,y,a[2*Mayn+1],u[2*Mayn+1],v[2*Mayn+1],ulen,vlen,ul,vl,tot,len,tmp; int main(){ qread(n);qread(m); ulen=vlen=0; for(int i=1;i<=n;i++){ if(i%2==1)u[++ulen]=i; else v[++vlen]=i; } for(int i=n+1;i<=n+n;i++){ if(i%2==1)u[++ulen]=i-n; else v[++vlen]=i-n; } ul=vl=1;tot=0; while(m--){ qread(x); if(x==2){ std::swap(ul,vl);tot++; } else{ qread(y); if(std::abs(y)%2==0){ ul=(ul-(y/2)+(n/2))%(n/2); if(ul==0)ul=n/2; vl=(vl-(y/2)+(n/2))%(n/2); if(vl==0)vl=n/2; } else{ if(y>0){ tmp=ul; ul=(vl-((y+1)/2)+(n/2))%(n/2); if(ul==0)ul=n/2; vl=(tmp-(y/2)+(n/2))%(n/2); if(vl==0)vl=n/2;tot++; } else{ tmp=ul; ul=(vl-((y)/2)+(n/2))%(n/2); if(ul==0)ul=n/2; vl=(tmp-((y-1)/2)+(n/2))%(n/2); if(vl==0)vl=n/2;tot++; } } } } if(tot%2==0){ len=1;for(int i=ul;i<=ul+(n/2);i++)a[len]=u[i],len+=2; len=2;for(int i=vl;i<=vl+(n/2);i++)a[len]=v[i],len+=2; } else{ len=1;for(int i=ul;i<=ul+(n/2);i++)a[len]=v[i],len+=2; len=2;for(int i=vl;i<=vl+(n/2);i++)a[len]=u[i],len+=2; } for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]); }T3 T3的话我不会!!! 不会的话听师兄讲题解是吧?好像时DP吧 然而我听都听不懂,你们有兴趣可以去做一下
查看原文:http://hz2016.cn/blog/?p=112
【训练】2017-11-6早
最新推荐文章于 2021-03-27 10:32:32 发布