Codeforces 727 D T-shirts Distribution

Description

有 \(6\) 种尺码的衣服,有的人只适合 \(1\) 种衣服,有的人适合相邻的 \(2\) 种,问是否存在合法方案,并输出.

Sol

贪心.

首先,只适合 \(1\) 种衣服的直接减去就好了,如果个数小于 \(0\) 了直接不合法.

然后考虑适合两种衣服的.首先就是,可以跑网络流或者二分图匹配.

一共就有 \(5\) 种情况 \((1,2),(2,3),(3,4),(4,5),(5,6)\) .

很容易的,我们就发现它其实可以贪心...

对于第 \(1\) 种情况,如果 \(1\) 号衣服有剩余的,那么就使用,然后不够就使用下一个即可.

以此类推.

排一下序,统计一下个数直接贪心就好.

Code

#include<cstdio>
#include<cstring>
#include<utility>
#include<algorithm>
#include<iostream>
using namespace std;

#define mpr(a,b) make_pair(a,b)
const int N = 100005;

int n,m,a[10],b[10];
int g[N];
pair< pair<int,int> , int>  p[N];
pair<int,int> q[10];
pair<int,int> ans;
int sum[10];

int kind(char a[]){
	if(a[0]==‘S‘) return 1;
	if(a[0]==‘M‘) return 2;
	if(a[0]==‘L‘) return 3;
	if(strlen(a)==2) return 4;
	if(strlen(a)==3) return 5;
	return 6;
}

int main(){
	for(int i=1;i<=6;i++) cin>>a[i],b[i]=a[i];
	cin>>n;
//	cout<<n<<endl;
	for(int i=1;i<=n;i++){
		char ch=getchar();
		char tmp[10];int l=0;
		memset(tmp,0,sizeof(tmp));
		while(ch>‘Z‘||ch<‘A‘) ch=getchar();
		while(ch>=‘A‘&&ch<=‘Z‘) tmp[l++]=ch,ch=getchar();

		if(ch==‘,‘){
			int t1=kind(tmp),t2;
			ch=getchar(),l=0,memset(tmp,0,sizeof(tmp));
			while(ch>‘Z‘||ch<‘A‘) ch=getchar();
			while(ch>=‘A‘&&ch<=‘Z‘) tmp[l++]=ch,ch=getchar();
			t2=kind(tmp);
			if(t1>t2) swap(t1,t2);
			p[++m]=mpr(mpr(t1,t2),i);
		}else{
			a[kind(tmp)]--,b[kind(tmp)]--;g[i]=kind(tmp);
			if(a[kind(tmp)]<0){ puts("NO");return 0; }
		}
	}
	sort(p+1,p+m+1);

	for(int i=1;i<=5;i++) q[i]=mpr(i,i+1);

	for(int i=1;i<=m;i++) for(int j=1;j<=5;j++) if(p[i].first==q[j]) sum[j]++;

	for(int i=1;i<=6;i++) if(a[i]<0){ puts("NO");return 0; }

	for(int i=1;i<=5;i++){
		if(a[i]>=sum[i]) a[i]-=sum[i];
		else{
			a[i+1]-=sum[i]-a[i],a[i]=0;
		}
		for(int j=1;j<=6;j++) if(a[j]<0){ puts("NO");return 0; }
	}
	for(int i=1;i<=6;i++) if(a[i]<0){ puts("NO");return 0; }
	puts("YES");
	for(int i=1;i<=m;i++){
		for(int j=1;j<=5;j++) if(p[i].first==q[j]){
			if(b[j]>a[j]) g[p[i].second]=j,b[j]--;
			else g[p[i].second]=j+1,b[j+1]--;
		}
	}
	for(int i=1;i<=n;i++){
		switch(g[i]){
			case 1:puts("S");break;
			case 2:puts("M");break;
			case 3:puts("L");break;
			case 4:puts("XL");break;
			case 5:puts("XXL");break;
			case 6:puts("XXXL");break;
		}
	}

	return 0;
}

  

时间: 2024-11-02 01:25:24

Codeforces 727 D T-shirts Distribution的相关文章

Codeforces 727 F. Polycarp&#39;s problems

Description 有一个长度为 \(n\) 有正负权值的序列,你一开始有一个值,每次到一个权值就加上,最少需要删掉多少数值才能到序列末尾.\(n \leqslant 750,m \leqslant 2 \times 10^5\) Sol DP+二分. 发现这个东西有后效性,就是前面选不选会影响后面的决策,并且权值太大无法记录. 但是我们可以倒着做,因为后面的决策无法影响前面的决策. \(f[i][j]\) 表示到 \(i\) 删掉 \(j\) 个至少需要的初始权值. 因为初始权值非负,所以

Codeforces 798D:Mike and distribution

Codeforces 798D:Mike and distributio 题目链接:http://codeforces.com/problemset/problem/798/D 题目大意:给出两个大小为$n$的数列$A,B$,现要求从这两个数列相同位置取出$K(K \leqslant n/2+1)$个数,使得$2 \times subA>sumA$且$2 \times subB>sumB$. 想法题 我们需要从数列$A$和数列$B$中取出$K$个数,使得这$K$个数的和比剩下$n-K$个数的和

4.30-5.1cf补题

//yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模,就抽空把最近没做的CF题补了点..毕竟明天开始又要继续上好多课呐...Yes, I can!(? •_•)?……(I can Huá shuǐ~~) codeforces 803 A. Maximal Binary Matrix   [简单构造] 题意:n行和n列填充零矩阵. 您要将k个1放在其中,使得得到

Codeforces 798D Mike and distribution - 贪心

Mike has always been thinking about the harshness of social inequality. He's so obsessed with it that sometimes it even affects him while solving problems. At the moment, Mike has two sequences of positive integers A = [a1, a2, ..., an] and B = [b1, 

Codeforces 798D Mike and distribution(贪心或随机化)

题目链接 Mike and distribution 题目意思很简单,给出$a_{i}$和$b_{i}$,我们需要在这$n$个数中挑选最多$n/2+1$个,使得挑选出来的 $p_{1}$,$p_{2}$,$p_{3}$,...,$p_{m}$满足 $a_{p1}+a_{p2}+a_{p3}+...+a_{p_{m}}>a_{1}+a_{2}+a_{3}+...+a_{n}$ $b_{p1}+b_{p2}+b_{p3}+...+b_{p_{m}}>b_{1}+b_{2}+b_{3}+...+b_

【算法系列学习】codeforces D. Mike and distribution 二维贪心

http://codeforces.com/contest/798/problem/D http://blog.csdn.net/yasola/article/details/70477816 对于二维的贪心我们可以先让它变成其中一维有序,这样只需要重点考虑另一维,就会简单很多. 首先,对于题目要求的选择元素之和两倍大与所有元素之和,我们可以转化为选择元素之和大于剩下的.然后我们可以将下标按照a从大到小排序.然后选择第一个,之后每两个一组,选择b大的一个,如果n是偶数再选择最后一个. 至于这样写

Codeforces 1167C - News Distribution

题目链接:http://codeforces.com/problemset/problem/1167/C 思路:初看好像是简单并查集,于是敲了个模板上去果断TLE!orz脑子抽了写了个O(n2)的算法.后面优化了一下就过了. AC代码: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int maxn = 5e5 + 5; 5 int far[maxn]; 6 //int Rank[max

【枚举】【二分】【推导】Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) D. Resource Distribution

题意:有两个服务要求被满足,服务S1要求x1数量的资源,S2要求x2数量的资源.有n个服务器来提供资源,第i台能提供a[i]的资源.当你选择一定数量的服务器来为某个服务提供资源后,资源需求会等量地分担给它们,要求每台服务器承担的资源需求不超过其所能提供的资源需求.给定一种合法的方案,每台服务器要么没有被分配给任何一个服务,或者被分配给其中一个服务. 对服务器按能提供的资源从小到大排序.枚举给S1分配的服务器数量i,然后在a数组中二分,就可以得到给S1提供的是哪i台服务器,它们占据了a数组中连续的

CodeForces 12C Fruits

Fruits Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 12C Description The spring is coming and it means that a lot of fruits appear on the counters. One sunny day little boy Valera deci