2016.11.10解题报告

2016.11.10

Part.1 油滴扩展(box

解题思路

暴力搜索(然而递归写错会很可怕),普遍用的stl求全排列然后搜的。注意求半径时要注意该点是否包含在前面已处理过的点扩展过的范围,此时这个点半径为0。四舍五入手打一个比较保险,(int)(x+0.5)

for (int i=1;i<=n;i++)

a[i]=i;

do{

     search();

       judge();

}while (next_permutation(a+1,a+n+1));

int p=(int)(sq-ans+0.5);//int向下取整;

cout<<p<<endl;

 

Part.2.数列(sequence

解题思路

又一道经典DP题,类似于最长公共子序列。f[i][j]表示前i个数删掉j个数得到的最优解:

for(int j=1;j<=n;j++)

{

   for (inti=j;i<=n;i++)

   {

       if (i&&j)

              f[i][j]=max(f[i-1][j-1],f[i-1][j]);

       if (cf[i]+j==0&&i)

          f[i][j]=max(f[i][j],f[i-1][j]+1);

     }

}

 

part.3 SOFTWAREsoftware

二分+多重背包(怎么又是DP……),首先我是根据“求最大值的最小值或最小值的最大值,有一定概率要用二分”的经验之谈看出来是个二分,然后直觉告诉我还要用个背包,结果一不留神想歪了以为要弄两个背包……DP完返回值处理的时候手抖加了个等号,Wa了3个点(上帝保佑竟然还能过7个……)

解题思路

直接二分答案,mid表示二分得到的完成时间,然后假设在这些时间第一个软件恰完成m个,这样就变成了一个容量为mid的多重背包,每个物品的件数k对应0~mid/t1[i],价值对应(mid-k*t1[i])/t2[i](充分利用第i个人工作的mid时间,枚举完成的软件1的模块数),目标是使软件2完成的模块数最多。这样D一遍再看结果和m的关系,ans<m说明无法完成任务,mid偏小,继续二分(mid+1,r)区间,否则二分(l,mid-1)区间。不得不说,要写出一个正确的二分确实不容易……

二分过程:

int ef(int l,int r)

{

     if(l>r) return ans;

     intmid=(l+r)/2;

     if(search(mid))

    {

       ans=mid;

       return ef(l,mid-1);

     }

     elsereturn ef(mid+1,r);

}

DP过程:

int search(int v)

{

     memset(f,-127,sizeof(f));

     f[0][0]=0;

     for(int i=1;i<=n;i++)

     {

         for(int j=0;j<=m;j++)

         {

              for(int k=0;k<=v/t1[i]&&k<=j;k++)

              {

                   intk1=k,k2=(v-k*t1[i])/t2[i];

                   f[i][j]=max(f[i][j],f[i-1][j-k1]+k2);

              }            

         }

     }

     if(f[n][m]<m)return false;

     elsereturn true;

}

Part.4 黑匣子(blackbox

最初并没有想到正解(平衡二叉树、二叉排序树并没有涉猎),随便写了个快排暴力过了30分。回过头看题解觉得神犇们真是机智……

解题思路copy自前x届学长的题解,此法甚妙,蒟蒻口拙难以复述只好直接搬了)

1.首先维护一个小根堆A和一个大根堆B,时时保证B堆元素个数为(i-1)。

2. 对于每次add(k)操作,首先将k加入堆B并维护B的性质,再将B堆的堆顶元素弹出,插入堆A,同时维护A、B堆的性质。这样不难发现B堆便是前(i-1)小的数,而A的堆顶元素便是第i的数。

3.对于每次get操作,弹出并输出A的堆顶元素,并将这个元素插入B中,维护A、B堆的性质。

priority_queue<int,vector<int>,greater<int>> q1;

     priority_queue<int,vector<int>> q2;

     ios::sync_with_stdio(false);

     int n,m;

     cin>>n>>m;

     for (int i=1;i<=n;i++)

      cin>>a[i];

     for (int i=1;i<=m;i++)

      cin>>b[i];

     int t=1,x,y;

     for (int i=1;i<=n;i++)

     {

         q2.push(a[i]);

         x=q2.top();

         q2.pop();

         q1.push(x);

         bool ff=0;

         while(i==b[t])

         {

              y=q1.top();

              q1.pop();

              q2.push(y);

              cout<<y<<endl;

              t++;

         }

     }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值