對拍練習 選擇客棧 NOIP 2011

2021-07-24 15:39:12 字數 3352 閱讀 8351

題目描述

麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾(總共 k 種,用整數 0 ~ k-1 表示),且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。

兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過 p 。

他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過 p元的咖啡店小聚。

輸入輸出格式

輸入格式:

輸入檔案hotel.in,共n+1 行。

第一行三個整數n ,k ,p,每兩個整數之間用乙個空格隔開,分別表示客棧的個數,色調的數目和能接受的最低消費的最高值;

接下來的n 行,第 i+1 行兩個整數,之間用乙個空格隔開,分別表示 i 號客棧的裝飾色調和i 號客棧的咖啡店的最低消費。

輸出格式:

輸出檔名為hotel.out 。

輸出只有一行,乙個整數,表示可選的住宿方案的總數。

輸入輸出樣例

輸入樣例#1:

5 2 3

0 5

1 3

0 2

1 4

1 5

輸出樣例#1: 3說明

【輸入輸出樣例說明】

2 人要住同樣色調的客棧,所有可選的住宿方案包括:住客棧①③,②④,②⑤,④⑤,但是若選擇住4 、5 號客棧的話,4 、5 號客棧之間的咖啡店的最低消費是4 ,而兩人能承受的最低消費是3 元,所以不滿足要求。因此只有前 3 種方案可選。

【資料範圍】

對於30% 的資料,有 n ≤100;

對於50% 的資料,有 n ≤1,000;

對於100%的資料,有 2 ≤n ≤200,000,0 < k ≤50,0≤p ≤100 , 0 ≤最低消費≤100。

【exercise】

以前就寫過選擇客棧…感覺60分的o(n^3)暴力非常好打…但是這道題的細節處理比較多…於是我就用這道題練習對拍了

對拍步驟挺簡單:

1.寫乙個正解

2.寫乙個暴力

3.寫乙個rand

4.寫乙個對拍**

【暴力】

先放乙個通俗易懂的 暴力.cpp

//選擇客棧 

#include

#include

#include

#include

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

const

int t=200001;

int n,k,p,mip,ans;

int color[t],low[t],pre[51],shu[51];

int main()

fo(i,1,n)

fo(j,i+1,n)

if(color[i]==color[j])}}

cout

0;}

好…現在把暴力輸出到 暴力.txt 裡了

【正解】

現在我嘗試寫一下正解…

//選擇客棧正解 

#include

#include

#include

#include

#define ll long long

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

const

int mxn=200005;

int n,m,p;

ll ans;

int c[mxn],a[mxn],num[100];

int main()

}else

if(flag)}}

cout

0;}

將正解輸出到 hotel.txt 裡去

【rand】

再看一下rand怎麼寫

//rand

#include

#include

#include

#include

#include

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using namespace std;

int main()

就是一堆隨機化…隨機出來的數輸出到乙個檔案 rand.txt 裡去

注意標頭檔案要寫ctime

【對拍】

最後看一下對拍函式

需要用到cstdlib標頭檔案

//對拍 

#include

#include

#include

#include

#include

#include

#define ll long long

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

int n;

int main()

return

0;}

這四個程式都是要執行的,先執行前三個,最後執行對拍

雙擊對拍即可執行

【執行結果】

如果沒有差異就是這個樣子的~

有差異的話就是下面這樣

有差異的話說明正解有問題,這時候根據 rand.txt 裡的資料除錯自己的正解程式就好啦。一開始先把rand函式裡的資料造的小一點,便於除錯,一直到無誤以後再除錯大資料。

希望可以對大家有幫助。謝謝。

對拍方法 pascal

這次noip看到旁邊用c 那位對拍得好爽,自己也搜了一下對拍的方法,可惜多不適合pascal黨,所以我中和幾種方法,終於弄出了乙個用 命令提示符對拍的方法。首先要有乙個 百分百對的程式 我寫了個排序 a.pas varn,e longint a array 0.1000 of longint pro...

對拍程式寫法

一口毒奶 bat的寫法 echo off loop rand.exe in txt mycode.exe in txt myout.txt baoli.exe in txt baoliout.txt fc myout.txt baoliout.txt if not errorlevel 1 goto...

0712 插曲 對拍

今天下午的時候聽yyy學長講了講對拍,下面總結一下下 大概就是拿你自以為的正解與你實實在在寫的暴力,進行輸出比較。相當於與標答進行比較 前提你的暴力是正確的 然後發現不同的地方,對 正解 程式進行修改,這樣可以提高你演算法的正確性。首先你要有輸入資料吧,而且必須是隨機的,按照題目要求的輸入。那麼我們...