zoukankan      html  css  js  c++  java
  • course

    这道题让我很感谢LCH!!!

     

    题目:

    LCH假期过得意犹未尽,所以上信息课的时候不免打瞌睡。但是他不希望落下老师讲的知识点,所以希望老师讲到重要地方的时候叫醒他。

    现在高老师告诉你每节课每分钟知识点的重要程度,并且以分数量化。

    LCH会告诉你他的睡眠计划(每分钟是睡着还是清醒),但他实在太困了,所以希望你只叫醒他一次,叫醒后他会在接下来的K分钟保持清醒,然后恢复他的睡眠计划(按照给出计划睡着或者清醒)。

    作为好朋友你当然希望他在有限时间内获得最多的知识,所以你希望选择一种叫醒方案,让他获得的知识量最大。

    数据输入:

    第一行输入n和k,用空格隔开,表示这堂课的总时间和叫醒一次能使LCH保持清醒的时间。

    第二行输入n个用空格隔开的数,表示这节课每分钟知识点的重要程度分值ai。

    第三行输入n个用空格隔开的数,表示每分钟LCH的睡眠计划,1表示他这一分钟清醒,0表示睡眠。

    数据输出:

    LCH这堂课收获的最大知识量。

    题解:可以用前缀和,定义一个sum数组,sum[i]=a[1]+a[2]+a[3]+......a[i];也就是sum[i]=sum[i-1]+a[i];接下来就很简单了,详情请见代码:

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    struct IT
    {
            int a;
    	int flag;	
    };
    IT p[100001];
    int n,m;
    int max_s=-2147483647;
    int sum2[100001];
    int fnd(int st)
    {
    	return sum2[st+m-1]-sum2[st-1];
    }
    int main()
    {
    	//freopen("course.in","r",stdin);
    	//freopen("course.out","w",stdout);
    	cin>>n>>m;
    	int sum=0;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&p[i].a);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&p[i].flag);
    		if(p[i].flag) sum+=p[i].a;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(!p[i].flag) sum2[i]=sum2[i-1]+p[i].a;/
    		else sum2[i]=sum2[i-1];
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(fnd(i)>max_s) 
    		{
    			max_s=fnd(i);
    		}
    	}
    	cout<<max_s+sum<<endl;
    	return 0;
    }
    
  • 相关阅读:
    Gym 101606 F-Flipping Coins(概率dp)
    Gym101350 J Lazy Physics Cat
    Gym 101350G
    hdu6188 Duizi and Shunzi (贪心或者dp)
    Gym101350 FMonkeying Around
    codeforce 457DIV2 C题
    codeforce 457DIV2 B题
    codeforce 461DIV2 F题
    codeforce 461DIV2 E题
    PE文件RV转FOA及FOA转RVA
  • 原文地址:https://www.cnblogs.com/chen-1/p/9479315.html
Copyright © 2011-2022 走看看