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