1. 程式人生 > >洛谷 P1230 智力大沖浪

洛谷 P1230 智力大沖浪

oid bow 教訓 我的博客 ace strong std 表示 奇葩

我的第一篇題解(辣雞題解)洛谷 P1230 智力大沖浪

題目描述

小偉報名參加中央電視臺的智力大沖浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的?!接下來主持人宣布了比賽規則:

首先,比賽時間分為n個時段(n≤500),它又給出了很多小遊戲,每個小遊戲都必須在規定期限ti前完成(1≤ti≤n)。如果一個遊戲沒能在規定期限前完成,則要從獎勵費m元中扣去一部分錢wi,wi為自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在一個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做遊戲的順序。作為參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢!註意:比賽絕對不會讓參賽者賠錢!

輸入輸出格式

輸入格式:

輸入文件riddle.in,共4行。

第1行為m,表示一開始獎勵給每位參賽者的錢;

第2行為n,表示有n個小遊戲;

第3行有n個數,分別表示遊戲1到n的規定完成期限;

第4行有n個數,分別表示遊戲1到n不能在規定期限前完成的扣款數。

輸出格式:

輸出文件riddle.out,僅1行。表示小偉能贏取最多的錢。

輸入輸出樣例

輸入樣例1

10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10

輸出樣例1

9950

下面來看思路啦:

誒喲,剛看到這題時,還覺得挺簡單的:哇,不就是個貪心加排序嗎?結果,做錯啦TAT!

本題思路:

因為要讓小偉獲得的獎金最多,就應該從扣款數多的小遊戲開始玩兒~所以呢,a表示遊戲規定完成的期限,b表示不能在規定期限前完成的扣款數,c表示這個小遊戲有沒有玩過。我們可以把b數組從大到小排一個序,然後枚舉b[i],能完成這個遊戲就完成這個遊戲,這醬紫就可以就可以讓小偉扣掉的獎金最少啦~

下面根據我的受到的教訓,總結一下這題需要註意的:

一、可以使用結構體(這是最好),可惜懶惰加奇葩的我就是不願意,非要用數組(還要手寫快排QAQ)

二、(dalao可以略過,細心的童鞋也可以略過)純屬小粗心,輸入的時候一定要分兩個for循環來做啊,不要像我一樣,一開始只用了一個循環TAT,找了10多分鐘,才發現錯誤555~

下面貼上本蒟蒻的代碼:

無註釋版:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using
namespace std; int ans,n; int a[1001],b[1001]; bool flag[1001]; void quicksort(int l,int r) { int i,j,m; i=l; j=r; m=b[(i+j)/2]; do { while (b[i]>m) i++; while (b[j]<m) j--; if (i<=j) { swap(a[i],a[j]); swap(b[i],b[j]); i++; j--; } } while (i<=j); if (i<r) quicksort(i,r); if (j>l) quicksort(l,j); } int main() { cin>>ans>>n; for (int i=1;i<=n;i++) cin>>a[i]; for (int j=1;j<=n;j++) cin>>b[j]; quicksort(1,n); for (int i=1;i<=n;i++) { for (int j=a[i];j>=1;j--) { if (flag[j]==0) { flag[j]=1; b[i]=0; break; } } } for (int i=1;i<=n;i++) ans=ans-b[i]; cout<<ans<<endl; return 0; }
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int ans,n;
int a[1001],b[1001];
bool flag[1001];//判斷該時段有沒有玩過遊戲
void quicksort(int l,int r)//快速排序
{
    int i,j,m;
    i=l;
    j=r;
    m=b[(i+j)/2];
    do
    {
        while (b[i]>m) i++;
        while (b[j]<m) j--; 
        if (i<=j)
        {
            swap(a[i],a[j]);
            swap(b[i],b[j]);
            i++;
            j--;
        }
    }
    while (i<=j);
    if (i<r) 
        quicksort(i,r);
    if (j>l) 
        quicksort(l,j);
}
int main()
{
    cin>>ans>>n;
    for (int i=1;i<=n;i++)
        cin>>a[i];
    for (int j=1;j<=n;j++)
        cin>>b[j];
    quicksort(1,n);//從大到小排序
    for (int i=1;i<=n;i++)//枚舉b[i]
    {
        for (int j=a[i];j>=1;j--)
        {
            if (flag[j]==0)//如果沒有玩過
            {
                flag[j]=1;
                b[i]=0;
                break;
            }
        }
    }
    for (int i=1;i<=n;i++)
        ans=ans-b[i];//計算獎金
    cout<<ans<<endl;
    return 0;
}

希望各位能在裏面學到些東西~(然而是不可能的QWQ)

作者:暄妍

我的博客:http://www.cnblogs.com/zbyrainbow/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

洛谷 P1230 智力大沖浪