10.15解题报告

T1:迷宫

测:100
裸的SPFA(裸得连读入优化都不能打)
表示不想打代码(哪怕只要复制


T2:训练

测:70
在考试的时候推出了只需要从前往后一步一步推而不需要考虑顺序所以做出暴力==,正解应该是用一个类似于前缀和的玩意让区间的取反时间变为O(1)

#include
#include
#include
#include
#include
using namespace std;
int f[5005],a[5005];
int n,ans,ansi;
char P;
int dfs(int k)
{
 int ans=0,sum=0;
 memset(f,0,sizeof(f));
 for(int i=1;i<=n-k+1;i++){
  if((a[i]+sum)&1){
   ans++;f[i]=1;
   sum++;
  }
   if(i-k+1>=0)sum-=f[i-k+1];
 }

 for(int i=n-k+2;i<=n;i++)
 {
  if((a[i]+sum)&1)return -1;    

  sum-=f[i-k+1];
 }
 return ans;    
}
int main()
{
 int i,j;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
   P=getchar();while(P!='B'&&P!='F')P=getchar();
   if(P=='B')a[i]=1;
   else a[i]=0;
  }
  ans=n+1;
  int p;
  for(i=1;i<=n;i++)
  {
    p=dfs(i);//printf("%d:%d ",i,p);
    if(p1)
    {
     ans=p;ansi=i;  
    }
  }
  printf("%d %d\n",ansi,ans);
 return 0;  
}

T3:部队

测:40
同样在考试时将淘汰的步骤写出,暴力40分
而处理后的序列我们可以发现是单调递增的,所以我们可以用一个带限制条件的最长不下降子序列来求解

#include
#include
#include
#include
#include
using namespace std;
#define Max(a,b) (a)>(b)?(a):(b)
int ans[100005],answ;
int n,k;
struct node
{
 int x,y;
}e[100005],a[100005];
int read()
{
 int x=0,f=1;
 char ch=getchar();
 while(ch<'0'||ch>'9')
 {
    if(ch=='-')f=-1;
    ch=getchar();
 }
 while(ch>='0'&&ch<='9')
 {
  x=(x<<3)+(x<<1)+ch-'0';
  ch=getchar();
 }
 return x*f;
}
int cmp(const node n1,const node n2)
{
 if(n1.xreturn 0;
 if(n1.x>n2.x)return 1;
 if(n1.yreturn 0;
 return 1;
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
 int i,j;
 n=read();k=read();
 for(i=1;i<=n;i++)
 {
  e[i].x=read();e[i].y=read();
 }
sort(e+1,e+1+n,cmp);
 a[1].x=e[1].x;a[1].y=e[1].y;
 int now=e[1].y;
 int tail=1;
 for(i=2;i<=n;i++)
 {
   if(now1]=1;
 for(i=2;i<=n;i++)
 {
    if(a[i-1].x-a[i].x+a[i].y-a[i-1].y<=k)ans[i]=ans[i-1]+1;
    else ans[i]=1;

   answ=Max(answ,ans[i]);   
 }
 printf("%d\n",answ);
 return 0;
} 

你可能感兴趣的:(做题总结)