第二屆太原理工大學程序設計新生賽決賽 L-The Scarborough Fair

題目傳送門

“Are you going to Scarborough Fair?”

Vanis來到了一座建在浮空島上的充滿着異域風格的小鎮,他發現島上使用着三種貨幣,他將這三種貨幣分別稱作A幣、B幣、C幣。
他發現,可以使用2枚A幣兌換1枚B幣,可以使用2枚B幣兌換1枚C幣,可以使用2枚C幣兌換1枚A幣(十分古怪的兌換規則)。
Vanis經過一番搜尋,成功找到了a枚A幣、b枚B幣、c枚C幣,他想要購買n個物品,每個物品只能夠用A、B、C三種幣的某一種購買。
Vanis想要知道他能否成功兌換到他想要的全部n個物品。

輸入描述:
第一行包含四個整數n、a、b、c,相鄰兩個整數之間使用一個空格符分隔。
第2~n+1行,每行有兩個用空格分隔的整數,其中第i行的兩個整數依輸入順序記作ti 和wi ti表示購買所需貨幣種類,1表示A幣,2表示B幣,3表示C幣。wi表示購買第i個物品需要花費wi 個種類爲ti 的貨幣。
數據規範:

  • 1≤n≤1000.
  • 0≤a, b, c≤10 ^6
    .
  • ti∈{1, 2, 3}.
  • 0≤wi ≤1000.
    輸出描述:
    如果Vanis能夠購買全部的nn種物品,則輸出YES,反之輸NO(輸出的大小寫任意)。
    示例1
    輸入

2 6 2 2
1 2
3 4

輸出

YES

示例2
輸入

2 6 1 2
1 2
3 4

輸出

NO

思路:這個題給的ti只有三個,那麼難度就大大地降低了,倘若ti有200個,這個題就變成了恐怖的網絡流(我不會,吳老師說的)。我只會簡單的模擬做法(我是真的辣雞),假如買第一種話費x的話,a要是直接夠就直接a-=x,a不夠的話就判斷a+(c/2)夠不夠,a+(c/2)不夠的話就繼續判斷a+(b/2+c)/2夠不夠,夠的話減去,不夠的話直接return 0。

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
int sum,n;
struct node{
    int ti,wi;
}d[maxn];
int main()
{
    int m,a,b,c,ti,wi,flag=1;
    cin>>n>>a>>b>>c;
    for(int i=1;i<=n;i++)
    {
        cin>>d[i].ti>>d[i].wi;
      
    }
    for(int i=1;i<=n;i++)
    {
        int x=d[i].ti,y=d[i].wi;
        if(x==1)
        {
           
            if(a>=y)
            {
                a-=y;
            }
            else if(a+c/2>=y)
            {
                a=0;
                c-=(y-a)*2;
            }
            else if(a+(b/2+c)/2>=y)
            {
                a=0;
                c=0;
                b-=(y-a-c/2)*4;
            }
            else
            {
               cout<<"NO"<<endl;
               return 0;
            } 
        }
        if(x==2)
        {
            
            if(b>=y)
            {
                b-=y;
            }
            else if(b+a/2>=y)
            {
                b=0;
                a-=(y-b)*2;
            }
            else if(b+(c/2+a)/2>=y)
            {
                a=0;
                b=0;
                c-=(y-b-a/2)*4;
            }
            else
            {
               cout<<"NO"<<endl;
               return 0;
            }
        }
        if(x==3)
        {
            
            if(c>=y)
            {
                c-=y;
            }
            else if(c+b/2>=y)
            {
                c=0;
                b-=(y-c)*2;
            }
            else if(c+(a/2+b)/2>=y)
            {
                c=0;
                b=0;
                a-=(y-c-b/2)*4;
            }
            else
            {
               cout<<"NO"<<endl;
               return 0;
            }
        }
    }
    cout<<"YES"<<endl;
    system("pause");
    return 0;

}

今天就解出來了這五個水題。這是最後一道接出來的。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章