链接:code forces
中文链接:洛谷P5118
题目大意:
FJ有两个挤奶棚,每个棚里面有一个奶罐,每个挤奶棚里面有10个容量大小不等的桶。
一共操作五次:
- 把每个奶罐里面加上1000加仑的牛奶
- 从棚1选一个桶,从奶罐里装满牛奶,倒到第二个棚的奶罐里,并把桶留在棚2
- 从棚2选一个桶,从奶罐里装满牛奶,倒到棚1,再把桶留下(此时拿走的桶可以是从棚1带过来的)
- 从棚1选一个桶,从奶罐里装满牛奶,倒到第二个棚的奶罐里,并把桶留在棚2
- 从棚2选一个桶,从奶罐里装满牛奶,倒到棚1,再把桶留下(此时拿走的桶可以是从棚1带过来的)
问5次操作后,棚1里奶罐的奶量一共有多少种可能。
数据大小:
每个桶大小不超过100
思路:
其实只有四次操作,如果模拟的话复杂度为10 *11 *10 *11(1e4大小)完全可行,那就模拟吧,哈哈~
(本来担心会不会出现把某一个奶罐取完,但是数据大小限制保证了不会出现这种情况了)
ac代码:
#include<iostream>
#include<cstdio>
ng namespace std;
typedef long long ll;
bool tank[20000];
bool tank1[20000];//负数
int main()
{
int a[12],b[12];
for(int i = 1;i<=10;i++)
scanf("%d",&a[i]);
for(int i = 1;i<=10;i++)
scanf("%d",&b[i]);
for(int i = 1;i<=10;i++)
{
int temp1 = 0;
temp1-=a[i];
b[11] = a[i];
a[i] = 0;
for(int j = 1;j<=11;j++)
{
int temp2 = temp1+b[j];
a[i] = b[j];
b[j] = 0;
for(int k = 1;k<=10;k++)
{
int temp3=temp2-a[k];
b[j] = a[k];
a[k] = 0;
for(int l = 1;l<=11;l++)
{
int temp4 = temp3+b[l];
if(temp4>=0)
tank[temp4] = 1;
else
tank1[-temp4] = 1;
}
a[k] = b[j];
b[j] = 0;
}
b[j] = a[i];
a[i] = 0;
}
a[i] = b[11];
b[11] = 0;
}
int tot = 0;
for(int i = 0;i<=15000;i++)
{
if(tank[i])
tot++;
if(tank1[i])
tot++;
}
printf("%d",tot);
return 0;
}