第二届太原理工大学程序设计新生赛决赛 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;

}

今天就解出来了这五个水题。这是最后一道接出来的。
在这里插入图片描述

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