“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能夠購買全部的種物品,則輸出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;
}
今天就解出來了這五個水題。這是最後一道接出來的。