1. 程式人生 > >Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) E

Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) E

排列 err osc esp efi 要求 pac mes break

題鏈

Description

給一個排列,要求每個激光打到指定的接受器上,最大化這個數量,你的手段只有在n*n的位置上放平面鏡。

Sol

我們發現一行要麽只放‘/’要麽只放‘\’,又發現answer=n||answer=n-1,這可以倒著合並。

Description

#include<bits/stdc++.h>
#define N 1006
using namespace std;
int n,a[N],last;
char ans[N][N];
signed main () {
    scanf(
"%d",&n); for (int i=1;i<=n;i++) { scanf("%d",a+i); if (a[i]!=i) last=i; } if (last) { char x=/, y=\\; for(int i=n;i;--i){ int p=0; if(x==/){for(int j=1;j<last;++j) if(a[j]!=j){ p=j; break;} } else for(int j=n;j>last;--j) if
(a[j]!=j){ p=j; break;} if(!p) break; ans[i][p]=ans[i][last]=ans[i][a[p]]=x; a[last]=a[a[p]], a[a[p]]=a[p], last=p; swap(x,y); cerr<<last<<endl; } } printf("%d\n",n-(!!last)); for(int i=1; i<=n; ++i, puts(""
)) for(int j=1; j<=n; ++j) putchar(ans[i][j]?ans[i][j]:.); }

Codeforces Round #516 (Div. 1, by Moscow Team Olympiad) E