传送门
题面描述:
一个人有两个牛奶仓库,每个仓库有1000单位的牛奶和10个桶,他闲着没事就喜欢在两个牛奶仓库之间运送牛奶玩儿,周二从仓库1选一个桶装满带到仓库2,周三从仓库2选一个桶装满带到仓库1(可能是周二带过来的那个),周四从仓库1选一个桶装满带到仓库2(可能是周三带过来的那个),周五再从仓库2选一个桶装满带到仓库1(可能是周二或周四带过来的那个),周六的时候他想知道仓库1可能会有多少种奶量。
题目分析:
可以纯模拟做,也可以想方法小小优化一下。我的做法是对情况进行分类,对于这个人一整周的操作可以分成三类:
- 同一个桶来回拿4次
- 4次拿桶中有两次拿了同一个桶
- 4次拿的桶都不一样
这三种情况就包含所有了,然后建立一个大于2000的数组,按上面三种情况模拟,成立的情况就把状态改为1,最后遍历数组看有多少个1就有多少种情况。
代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
int a[10],b[10],num[2005]={0};
int main(){
int ans=0;
for(int i=0;i<10;i++) cin>>a[i];
for(int i=0;i<10;i++) cin>>b[i];
num[1000]=1;//同一个桶来回拿4次,不变
for(int i=0;i<10;i++){//有两次拿了同一个桶
for(int j=0;j<10;j++) num[1000-a[i]+b[j]]=1;
}
for(int tues=0;tues<10;tues++){//四次都没有拿同一个桶
for(int wed=0;wed<10;wed++){
for(int thur=0;thur<10;thur++){
if(thur==tues) continue;
for(int fri=0;fri<10;fri++){
if(fri==wed) continue;
num[1000-a[tues]+b[wed]-a[thur]+b[fri]]=1;
}
}
}
}
for(int i=0;i<=2000;i++) if(num[i]) ans++;
cout<<ans;
}