codeforces 727D

一个贪心题,只是在写代码上面比较复杂。

如果一个人只有号码的需求,我们直接分给他就好。

剩下的都是需求他个人的,我们不妨把这些需求都从小号到大号排序

每个人,优先分小号,然后再发大一号,只有有一个人不满足条件,我们就可以直接输出NO

这里用到了一个结构体,因为我要记录ID号,所以我们就没用pair

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <map>
using namespace std;

map<string,int>num;
map<int,string>num1;
map<int, string>answer;

struct data{
	int first, second;
	int id;
}ans[100000];

bool cmp(data a, data b)
{
	
	return a.first < b.first;
}

int a[10];

int main()
{
	int i,j;
	//给我们字符串编号
	num["S"] = 1;
	num["M"] = 2;
	num["L"] = 3;
	num["XL"] = 4;
	num["XXL"] = 5;
	num["XXXL"] = 6;
	num1[1] = "S";
	num1[2] = "M";
	num1[3] = "L";
	num1[4] = "XL";
	num1[5] = "XXL";
	num1[6] = "XXXL";


	while(~scanf("%d", &a[1]))
	{
		string s;
		
		for(i = 2; i <= 6; i++)
			scanf("%d", a + i);
		int n;
		scanf("%d", &n);
		int flag = 1;
		int sum = 0;

		for(j = 1; j <= n; j++)
		{
			cin >> s;
			int found = s.find(",");
			//printf("%d\n", found);

			if(s.find(",") == -1) //没有找到逗号,就是他要求的是我们固定的衣服,我们可以直接赋值
			{
				int id = num[s];
				a[id]--;
				answer[j] = s;
				if(a[id] < 0)
				{
					flag = 0;
					break;
				}
			}

			else
			{
				string first,second;
				first = "";
				second = "";

				for(i = 0; i < found; i++)
					first += s[i];
				for(i = found + 1; i < s.size(); i++)
					second += s[i];

				int id_first = num[first];
				int id_second = num[second];

				ans[sum].first = id_first;
				ans[sum].second = id_second;
				ans[sum].id = j; 
				sum++;
			}
			//cout << s << endl;
		}

		if(flag ==0)
			printf("NO\n");else{
			sort(ans, ans+sum, cmp);for(i =0; i < sum; i++){if(a[ans[i].first]>=1){
					a[ans[i].first]--;
					answer[ans[i].id]= num1[ans[i].first];continue;}elseif(a[ans[i].second]>=1){
					a[ans[i].second]--;
					answer[ans[i].id]= num1[ans[i].second];continue;}else{
					flag =0;break;}}if(flag ==0)
				printf("NO\n");else{
				printf("YES\n");for(i =1; i <= n; i++)
					cout << answer[i]<< endl;}}}return0;}
posted @ 2016-11-09 06:15  fzfn5049  阅读(204)  评论(0编辑  收藏  举报