小可买菜(buy)

(buy.cpp/c)
小可买菜
问题描述
小可对达达真的是真爱!
小可为了体现对达达的爱,特意要为即将下班的达达做一顿丰富的晚饭!做饭之前需要先购买足够的新鲜的食材,小可来到了超市。
小可列了一个购买清单,总共有 个食材需要购买,在超市中第 个食材的价格是 。
今天超市正在进行促销活动,每满两个商品,都可以进行促销活动,使用两个商品中最高价格购买当前这两件商品。
为了节省金钱,小可还在线购买了 张超市折扣券,每两件商品可以使用一张折扣券,使用两个商品中最低价格购买当前这两件商品。
注意:商品不能重复参加活动。
请问小可购买清单中所有物品都购买后,最低花费多少元。
输入格式
第一行输入两个整数 ,含义如题所示。
第二行输入 个整数 ,数字以空格分隔,表示每个食材价格。
输出格式
输出一行包含一个整数,表示小可购买清单中所有物品都购买后,最低花费多少元。
输入样例1
输出样例1
输入样例2
输出样例2
4 1
1 2 3 4
4
13 2
1 3 2 4 7 8 9 6 3 8
19

本题需要先进行排序,如果还有优惠券,就用便宜的带贵的,否则一贵带一贵,

利用双指针完成程序。

AC代码

#include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    long long n,k,a[1000005],ans;
    int main(){
	    freopen("buy.in","r",stdin);
	    freopen("buy.out","w",stdout);
	    cin>>n>>k;
	    for(int i=1;i<=n;i++){
		    cin>>a[i];
	    }
	    sort(a+1,a+n+1);
	    int l=1,r=n;
	    while(l<=r){
		    if(k>0){
			    ans+=a[l];
			    l++,r--,k--;
		    }else{
			    ans+=a[r];
			    r-=2;
		    }
	    }
	    cout<<ans;
	    fclose(stdin);
	    fclose(stdout);
	    return 0;
    } 

在Android中,要实现一个中间大两边小的ViewPager滚动效果,通常会使用`ViewPager`配合`PagerAdapter`来管理Fragment,并通过自定义布局或者适配器来设计卡片式的外观。以下是一个简化的步骤: 1. **创建项目结构**: - 在`activity_main.xml`布局文件中设置一个`CoordinatorLayout`作为根容器。 - 在`CoordinatorLayout`内添加一个`LinearLayout`作为水平布局,将`android:orientation="horizontal"`属性设为水平方向。 ```xml <androidx.coordinatorlayout.widget.CoordinatorLayout> <LinearLayout android:id="@+id/content_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <!-- 这里将会放ViewPager --> </LinearLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 2. **创建`PagerAdapter`**: 创建一个自定义的PagerAdapter,比如`MiddleCardPagerAdapter`,它可以根据指定的页面索引来调整显示的fragment大小。 ```java public class MiddleCardPagerAdapter extends FragmentStatePagerAdapter { private int[] fragmentWidths; // 存储每个Fragment的宽度 public MiddleCardPagerAdapter(FragmentManager fm, int[] fragmentWidths) { super(fm); this.fragmentWidths = fragmentWidths; } @Override public Fragment getItem(int position) { return createFragment(position); } @Override public int getCount() { // 根据需求计算fragment的数量 return fragmentWidths.length; } private Fragment createFragment(int position) { // 实现Fragment并设置其宽度为数组中的值 MyFragment myFragment = new MyFragment(); myFragment.setRetainInstance(true); // 保留实例以便于动态修改宽度 View itemView = LayoutInflater.from(context).inflate(R.layout.fragment_card, null); ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams) itemView.getLayoutParams(); layoutParams.width = fragmentWidths[position]; itemView.setLayoutParams(layoutParams); return myFragment; } } ``` 3. **设置ViewPager**: 在MainActivity中初始化`ViewPager`, 设置Adapter,并监听滑动事件。 ```java ViewPager viewPager = findViewById(R.id.view_pager); MiddleCardPagerAdapter adapter = new MiddleCardPagerAdapter(getSupportFragmentManager(), createFragmentWidthArray()); viewPager.setAdapter(adapter); // 监听滑动,改变中间Fragment的宽度来模拟大小变化 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == 0 || position == adapter.getCount() - 1) { // 边缘位置不变 return; } MyFragment middleFragment = (MyFragment) viewPager.findFragmentByTag("middle_fragment"); if (middleFragment != null) { middleFragment.updateWidth(positionOffset); } } // 其他方法... }); ``` 4. **自定义Fragment** (`MyFragment`): `MyFragment`需要包含一个用于更新宽度的方法,并根据传入的值调整视图尺寸。 ```java public class MyFragment extends Fragment { private View mView; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mView = inflater.inflate(R.layout.fragment_card, container, false); // 初始化并添加宽度变化的相关逻辑 return mView; } public void updateWidth(float offset) { // 根据offset百分比调整中间部分的宽度 ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams) mView.getLayoutParams(); layoutParams.width = Math.max(minWidth, (int) (mOriginalWidth * (1 + offset))); mView.setLayoutParams(layoutParams); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值