“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能够购买全部的 n n n种物品,则输出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;
}
今天就解出来了这五个水题。这是最后一道接出来的。