2021国庆模拟赛|2021-10-04 模拟赛


国庆模拟赛(二)

    • 1、[P1563 [NOIP2016 提高组] 玩具谜题](https://www.luogu.com.cn/problem/P1563)
    • 2、[P2615 [NOIP2015 提高组] 神奇的幻方](https://www.luogu.com.cn/problem/P2615)
    • 3、[P2827 [NOIP2016 提高组] 蚯蚓](https://www.luogu.com.cn/problem/P2827)
    • 4、[P3960 [NOIP2017 提高组] 列队](https://www.luogu.com.cn/problem/P3960)

1、P1563 [NOIP2016 提高组] 玩具谜题 【2021国庆模拟赛|2021-10-04 模拟赛】算法思路:模拟
可能的解法:???
#include using namespace std; const int N=1e5+10; int n,m,now=0; int d[N]; string s[N]; int main(){ //freopen("toy.in","r",stdin); //freopen("toy.out","w",stdout); scanf("%d %d",&n,&m); for(int i=0; i>s[i]; } while(m--){int dire,num; scanf("%d %d",&dire,&num); if(d[now]) num=-num; if(dire) num=-num; now=now+n-num; while(now>=n) now-=n; } cout<[now]; return 0; }

估分:100
实际得分:100
想法:大模拟,num正负左右横移 ,签到题。
(自认为写的还是比较短的)
2、P2615 [NOIP2015 提高组] 神奇的幻方 算法思路:大模拟 × \times × 2
可能的解法:???
#includeusing namespace std; int a[50][50]; int n; int main(){ //freopen("magic.in","r",stdin); //freopen("magic.out","w",stdout); scanf("%d",&n); int tot=n*n-1; a[1][n/2+1]=1; int i=1,j=n/2+1; while(tot--){if(i==1&&j!=n){i=n; j++; } else if(j==n&&i!=1){j=1; i--; } else if(i==1&&j==n){i++; } else if(a[i-1][j+1]==0){i--; j++; } else{i++; } a[i][j]=n*n-tot; } for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){printf("%d ",a[i][j]); } printf("\n"); } return 0; }

估分:100
实际得分:100
想法:模拟 × \times × 2
3、P2827 [NOIP2016 提高组] 蚯蚓 算法思路:感觉类似前缀和
可能的解法:优先队列
#includeusing namespace std; int const N=8*1e6; int n,m,q,u,v,t,qz; double p; int a[N]; int main(){ //freopen("earthworm.in","r",stdin); //freopen("earthworm.out","w",stdout); scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t); p=(double)u/v; for(int i=1; i<=n; i++){scanf("%d",&a[i]); } int cnt=n; sort(a+1,a+cnt+1); for(int i=1; i<=m; i++){int x=a[cnt]+qz; if(i%t==0) printf("%d ",x); int d1=floor(p*x); int d2=x-floor(p*x); cnt++; a[cnt-1]=d1-qz-q; a[cnt]=d2-qz-q; sort(a+1,a+cnt+1); qz+=q; } printf("\n"); for(int i=t; i<=cnt; i+=t){printf("%d ",a[cnt-i+1]+qz); } return 0; }

估分:60
实际得分:35
一次订正(使用优先队列90pts)
#includeusing namespace std; int n,m,q,u,v,t,qz; double p; priority_queue a; int main(){ //freopen("earthworm.in","r",stdin); //freopen("earthworm.out","w",stdout); scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t); p=(double)u/v; for(int i=1; i<=n; i++){int x; scanf("%d",&x); a.push(x); } for(int i=1; i<=m; i++){int x=a.top()+qz; if(i%t==0) printf("%d ",x); int d1=floor(p*x); int d2=x-floor(p*x); a.pop(); a.push(d1-qz-q); a.push(d2-qz-q); qz+=q; } printf("\n"); for(int i=1; i<=n+m; i++){if(i%t==0){int x=a.top(); printf("%d ",x+qz); } a.pop(); } return 0; }

想法:高分易,满分难。
4、P3960 [NOIP2017 提高组] 列队 算法思路:模拟骗分
可能的解法:???
#includeusing namespace std; int a[1010][30100]; int n,m,q; int main(){ //freopen("phalanx.in","r",stdin); //freopen("phalanx.out","w",stdout); scanf("%d%d%d",&n,&m,&q); for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){a[i][j]=(i-1)*m+j; } } while(q--){int x,y; scanf("%d%d",&x,&y); printf("%d\n",a[x][y]); int away=a[x][y]; for(int i=y; i

估分:40
实际得分:30
想法:紫题万岁!
总得分
265/400
反思:基础数据结构要会用 (priority_queue不会写的悲伤)
蒟蒻的国庆模拟赛(二)
——2021.10.4

    推荐阅读