【动态规划】Barn Repair 修理牛棚 (Usaco_Training 1.3)

Barn Repair

It was a dark and stormy night that ripped the roof and gates off the stalls that hold Farmer John's cows. Happily, many of the cows were on vacation, so the barn was not completely full.

The cows spend the night in stalls that are arranged adjacent to each other in a long line. Some stalls have cows in them; some do not. All stalls are the same width.

Farmer John must quickly erect new boards in front of the stalls, since the doors were lost. His new lumber supplier will supply him boards of any length he wishes, but the supplier can only deliver a small number of total boards. Farmer John wishes to minimize the total length of the boards he must purchase.

Given M (1 <= M <= 50), the maximum number of boards that can be purchased; S (1 <= S <= 200), the total number of stalls; C (1 <= C <= S) the number of cows in the stalls, and the C occupied stall numbers (1 <= stall_number <= S), calculate the minimum number of stalls that must be blocked in order to block all the stalls that have cows in them.

Print your answer as the total number of stalls blocked.

PROGRAM NAME: barn1

INPUT FORMAT

Line 1:M, S, and C (space separated)Lines 2-C+1:Each line contains one integer, the number of an occupied stall.

SAMPLE INPUT (file barn1.in)

4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43

OUTPUT FORMAT

A single line with one integer that represents the total number of stalls blocked.

SAMPLE OUTPUT (file barn1.out)

25

[One minimum arrangement is one board covering stalls 3-8, one covering 14-21, one covering 25-31, and one covering 40-43.]

 

[ 一种最优的安排是用板拦牛棚3-8,14-21,25-31,40-43.]

 

 

这一题方法很多了,可以假设全部都单独用一个木板,然后依次找最小的间隙进行合并,一直到间隙<n的时候去找最小值

当然还可以用动态规划来做,用f[i][j]表示用第 i 块木板搭建到第 j 个牛棚所能达到的最小总长度

f[i][j]=max(f[i-1][j-1]+1,f[i][j-1]+a[j]-a[j-1]);

 

C++ Code

/*
ID: jiangzh15
TASK: barn1
LANG: C++
*/
//   http://oijzh.cnblogs.com
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 200
#define INF 0x7fffffff

int n,s,c,a[MAXN],f[60][MAXN];

int main()
{
    freopen("barn1.in","r",stdin);
    freopen("barn1.out","w",stdout);
    scanf("%d%d%d",&n,&s,&c);
    int i;
    for(i=1;i<=c;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+1+c);
    memset(f,63,sizeof(f));
    f[0][0]=0;
    for(i=1;i<=n;i++)
        for(int j=1;j<=c;j++)
        {
            if(i>0&&j>0)f[i][j]=min(f[i][j],f[i-1][j-1]+1);
            if(j>0)f[i][j]=min(f[i][j],f[i][j-1]+a[j]-a[j-1]);
        }
    int minp=INF;
    for(i=1;i<=n;i++) minp=min(minp,f[i][c]);
    printf("%d\n",minp);
    return 0;
}

 

 

转载于:https://www.cnblogs.com/oijzh/archive/2012/10/10/2719033.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你有一个Spinner来选择餐厅类型,一个ListView来显示餐厅列表,并且ListView的数据源是一个餐厅数组。 首先,你需要创建一个适配器来将餐厅数组显示在ListView上: ```java public class RestaurantAdapter extends ArrayAdapter<Restaurant> { public RestaurantAdapter(Context context, ArrayList<Restaurant> restaurants) { super(context, 0, restaurants); } @Override public View getView(int position, View convertView, ViewGroup parent) { // Inflate the view if needed if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.restaurant_list_item, parent, false); } // Get the restaurant at this position Restaurant restaurant = getItem(position); // Set the name and other details of the restaurant in the view TextView nameTextView = convertView.findViewById(R.id.nameTextView); nameTextView.setText(restaurant.getName()); TextView descriptionTextView = convertView.findViewById(R.id.descriptionTextView); descriptionTextView.setText(restaurant.getDescription()); // Return the view return convertView; } } ``` 然后,在你的Activity中,你需要设置Spinner的适配器和监听器,并且在监听器中更新ListView的数据源和适配器: ```java public class MainActivity extends AppCompatActivity { private Spinner mTypeSpinner; private ListView mRestaurantListView; private RestaurantAdapter mRestaurantAdapter; private ArrayList<Restaurant> mRestaurants; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialize the views and data mTypeSpinner = findViewById(R.id.typeSpinner); mRestaurantListView = findViewById(R.id.restaurantListView); mRestaurants = new ArrayList<>(); mRestaurants.add(new Restaurant("Pizza Palace", "The best pizza in town!", "Italian")); mRestaurants.add(new Restaurant("Burger Barn", "Juicy burgers and fries!", "American")); mRestaurants.add(new Restaurant("Sushi Station", "Fresh sushi rolls made to order!", "Japanese")); mRestaurantAdapter = new RestaurantAdapter(this, mRestaurants); mRestaurantListView.setAdapter(mRestaurantAdapter); // Set the adapter and listener for the type spinner ArrayAdapter<CharSequence> typeAdapter = ArrayAdapter.createFromResource(this, R.array.restaurant_types, android.R.layout.simple_spinner_item); typeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mTypeSpinner.setAdapter(typeAdapter); mTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // Get the selected type from the spinner String selectedType = parent.getItemAtPosition(position).toString(); // Create a new list of restaurants that match the selected type ArrayList<Restaurant> filteredRestaurants = new ArrayList<>(); for (Restaurant restaurant : mRestaurants) { if (restaurant.getType().equals(selectedType)) { filteredRestaurants.add(restaurant); } } // Update the adapter with the filtered list of restaurants mRestaurantAdapter.clear(); mRestaurantAdapter.addAll(filteredRestaurants); mRestaurantAdapter.notifyDataSetChanged(); } @Override public void onNothingSelected(AdapterView<?> parent) { // Do nothing } }); } } ``` 这里假设你的Spinner的选项是从资源文件中加载的,例如: ```xml <string-array name="restaurant_types"> <item>Italian</item> <item>American</item> <item>Japanese</item> </string-array> ``` 当用户选择Spinner的选项时,监听器会获取选中的字符串,然后遍历餐厅数组,将与选中字符串匹配的餐厅添加到新的ArrayList中。然后清空ListView的适配器并将新的ArrayList添加到适配器中,最后调用notifyDataSetChanged()方法更新ListView的显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值