1. 程式人生 > >[Offer收割]程式設計練習賽3

[Offer收割]程式設計練習賽3

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-03-30-21.00
*/
#include <queue>
#include <cstdio>
#include <set>

#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long(LL);
typedef unsigned long long
(ULL);
const double eps(1e-8);

const int N=1010;
LL a[N],dp[N][N];

int main()
{
   int Cas;
   cin>>Cas;
   while(Cas--)
   {
       int n,m,s,t;
       cin>>n>>m>>s>>t;
       for(int i=1;i<=n;++i)
       {
           cin>>a[i];
           fill(dp[i],dp[i]+N,INT_MAX);
       }

       fill(dp[0],dp[0]+N,0);
       for(int i=1;i<=n;++i)
       {
           int max_right=a[i]/s;
           if(a[i]%s) ++max_right;
           for(int right=0;right<=max_right;++right)
           {
               int dif=a[i]-s*right,fault=0;
               if(dif>0)
               {
                   if(dif%t) fault=dif/t+1;
                   else fault=dif/t;
               }
               fault=max(fault,0);
               for(int chance=m;chance>=right+fault;--chance)
                   dp[i][chance]=min(dp[i][chance],dp[i-1][chance-(right+fault)]+right);
           }
       }
       if(dp[n][m]<INT_MAX)
           cout<<dp[n][m]<<endl;
       else
           cout<<"No"<<endl;
   }
   return 0;
}
/*

*/


/**< 帶註釋版 */
/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-03-30-21.00
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long(LL);
typedef unsigned long long(ULL);
const double eps(1e-8);

const int N=1010;
LL a[N],dp[N][N];

int main()
{
   int Cas;
   cin>>Cas;
   while(Cas--)
   {
       int n,m,s,t;
       cin>>n>>m>>s>>t;
       for(int i=1;i<=n;++i)
       {
           cin>>a[i];
           fill(dp[i],dp[i]+N,INT_MAX);
       }
       fill(dp[0],dp[0]+N,0);
       for(int i=1;i<=n;++i) // 到第i關為止
       {
           //對於本關,答對max_right題時,不算錯題的分值也能通關
           int max_right=a[i]/s;
           if(a[i]%s) ++max_right;
           for(int right=0;right<=max_right;++right)  // 列舉答對的題數
           {
               //答對right題時,需要答錯多少題
               int dif=a[i]-s*right,fault=0;
               if(dif>0)
               {
                   if(dif%t) fault=dif/t+1;
                   else fault=dif/t;
               }
               fault=max(fault,0);
               for(int chance=m;chance>=right+fault;--chance)
                   dp[i][chance]=min(dp[i][chance],dp[i-1][chance-(right+fault)]+right);
               // dp[i][j] ------到本關為止,若只有chance次答題機會,本關答對了right題,若本關能夠通關,到本關為止總共最少需要答對多少題
               // chance-(right+fault) ----- 總共答題機會為chance,本關用了right+fault次,前面所有關只有chance-(right+fault)次機會
           }
       }
       if(dp[n][m]<INT_MAX)
           cout<<dp[n][m]<<endl;
       else
           cout<<"No"<<endl;
   }
   return 0;
}
/*

*/

相關推薦

hihoCoder 1285 [Offer收割]程式設計練習賽3-3

[Offer收割]程式設計練習賽3——第3題 這次練習賽感覺比前兩次練習賽簡單一點,第1第2題就不說了。 #1285 : 智力競賽 時間限制: 5000ms 單點時限: 1000ms

[Offer收割]程式設計練習賽3

/** * ----------------------------------------------------------------- * Copyright (c) 2016 crazyacking.All rights reserved. * ---------------------------

[offer收割]程式設計練習賽3-題目2:機會渺茫

描述 小Hi最近在追求一名學數學的女生小Z。小Z其實是想拒絕他的,但是找不到好的說辭,於是提出了這樣的要求:對於給定的兩個正整數N和M,小Hi隨機選取一個N的約數N',小Z隨機選取一個M的約數M',如果N'和M'相等,她就答應小Hi。 小Z讓小Hi去編寫這個隨機程式,到時候她review過沒有問題了就可以

[Offer收割]程式設計練習賽79——字母去重

[Offer收割]程式設計練習賽79——字母去重 題目 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個字串S,每次操作你可以將其中任意一個字元修改成其他任意字元。 請你計算最少需要多少次操作,才能使得S中不存在兩個相鄰的相同字元。

hihoCoder [Offer收割]程式設計練習賽83 D 生成樹問題

題目 從 Kruskal 演算法的角度來思考這個問題。 考慮 $n$ 個點的“空圖”(即沒有邊的圖)。 先將 $m_2$ 條無權值的邊加到圖中,得到一個森林。 將 $m_1$ 條有權值的邊按權值從小到大排序。 列舉這些邊,對於邊 $e\colon(u, v, w)$,若將 $e$ 加入圖中之後 (i)

[Offer收割]程式設計練習賽84 -- 括號序列

時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個只包含'(', ')'和''的字串S,現在小Hi可以任意指定''為'('或')',不同的'*'可以是不同的字元。 請你判斷小Hi是否可能得到一個合法匹配的字串。 輸入 第一行包含一個整數T,代表資料的組數。 以

[Offer收割]程式設計練習賽9 B題 水陸距離

題目2 : 水陸距離 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個N x M的01矩陣,其中1表示陸地,0表示水域。對於每一個位置,求出它距離最近的水域的距離是多少。 矩陣中每個位置與它上下左右相鄰的格

[Offer收割]程式設計練習賽2 hihocoder 1275 掃地機器人 (計算幾何+模擬 比較煩)

時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 小Ho最近買了一臺掃地機器人用來代替他清掃實驗室的衛生,掃地機器人有不同的尺寸,但是通常來說可以被視作一個M*M的正方形,掃地機器人僅能清掃被自己覆蓋過的區域。 小Ho所在的實驗室是一個

[Offer收割]程式設計練習賽49

A.相似顏色 每兩位列舉一下0~15,更新一下就好了。。 #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,a,b)

[Offer收割]程式設計練習賽56:卡片遊戲

#include<bits/stdc++.h> #include <assert.h> using namespace std; const int maxn = 1e5+11

hihocoder [Offer收割]程式設計練習賽19

題目1 : 大禮堂地毯 列舉 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std;

Offer收割]程式設計練習賽15-題目1 : 偶像的條件】

【連結】:https://hihocoder.com/contest/offers15/problems 【題目描述】: 題目1 : 偶像的條件 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 小Hi的學校正面臨著廢

[Offer收割]程式設計練習賽4

    #include <iostream> #include <string.h> #include <string> using namespace std; int main() { int n,x; int a[25]; cin >&

[Offer收割]程式設計練習賽27:題目2 : 兩個機器人

描述 一個N × M的2D迷宮中有兩個機器人。機器人A在迷宮左上角,只能向右或向下移動;機器人B在迷宮右下角,只能向左或向上移動。機器人不能移動到迷宮外。此外,由於奇怪的同步機制,這兩個機器人只能同時向相反的方向移動。也就是說或者機器人A向右同時機器人B向左;或者機器人A向下同時機器人B向上移動。   迷

[Offer收割]程式設計練習賽1 hihocoder 1270 建造基地 (完全揹包)

時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 在遙遠的未來,小Hi成為了地球聯邦外空間聯合開發工作組的一員,前往一顆新發現的星球開發當地的重金屬資源。 為了能

HiHoCoder #1270 : 建造基地 [Offer收割]程式設計練習賽1 【完全揹包】

描述 在遙遠的未來,小Hi成為了地球聯邦外空間聯合開發工作組的一員,前往一顆新發現的星球開發當地的重金屬資源。 為了能夠在當地生存下來,小Hi首先要建立一個基地。建立基地的材料可以直接使用當地的石材和富裕的重金屬資源。基地建設分為N級,每一級都需要達成K的建設值後才能夠完成建設,當前級別的建設值溢位後不會

九宮(DFS)——hiho [Offer收割]程式設計練習賽1

描述 小Hi最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1~9不重複的填入一個3*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。 三階幻方又被稱作九宮格,在小學奧數裡有一句非常有名的口訣:“二四為肩,六八為足,左三右七,戴九履一,五居其中”,通過這樣

[Offer收割]程式設計練習賽79

題目 題目1: 題意: 給定一個字串S,每次操作你可以將其中任意一個字元修改成其他任意字元,請你計算最少需要多少次操作,才能使得S中不存在兩個相鄰的相同字元。 思路: 從第二個字元往後,如果字元相同ans+1。因為s[i]的改變會對s[i-1],s[i+1]都產

hihocoder1368即 [Offer收割]程式設計練習賽7第四題

hihocoder1368即 [Offer收割]程式設計練習賽7第四題: 積水的城市2 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 提示:本題與“積水的城市”相比,資料範圍擴大了。 如下圖所示,某市市區由M條南

[Offer收割]程式設計練習賽29 題目1 : 逃離迷宮4

描述 小Hi被壞女巫抓進一座由無限多個格子組成的矩陣迷宮。 小Hi一開始處於迷宮(x, y)的位置,迷宮的出口在(a, b)。小Hi發現迷宮被女巫施加了魔法,假設當前他處在(x, y)的位置,那麼他只能移動到(x+y, y)或者(x, x+y)的位置上。 小Hi想知道自己能不能逃離迷宮。 輸入 第一行包