关灯问题

看lzx的题解才写出来,lzx太神辣

原题:

在四川省绵阳中学的毓才路上,新建了若干漂亮的路灯,这给同学们晚上的出行带来很大的方便。但是,问题随之出现了。
一天晚上,我们信息学竞赛班的 SFJ 同学正往校门外走,忽然眼前一片漆黑,于是直 接把眼镜都摔掉了,再也找不到。后来 SFJ 同学从学校管理处了解到昨晚路灯突然熄灭是 因为电路不堪重负,导致空气开关跳闸。
善于思考的 SFJ 同学考虑将路灯进行改建,以避免再次出现类似的问题。
SFJ 同学仔细了解每盏路灯的耗电量 a[i]与照明度 z[i],已知共有 N 盏电灯,并且每盏电灯都可能有不同的耗电量与照明度,现在的问题是要把这 N 盏电灯分为 M 组,新分出的每组灯的耗电量(即是该组所有打开电灯的耗电量之和)不能超过该组的电灯数目的 T倍,在满足这样的前提下使得照明度尽可能的大,最后算出 M 组的最大照明度的和。由于每组耗电量的限制,该组中的某些电灯可能不被使用,但是仍然应该算作该组灯的数目。特别注意的是电灯按顺序给出,只能把相邻的几盏灯分在一组。 由于计算较为复杂,SFJ 同学经过反复的计算仍然不能确定结果,现在就请你为他编写
一个程序来解决这个问题。

2<=N<=160,1<=M<=50,1<=T,a[i],z[i]<=50

n^4很容易想

现在关键是如何优化到n^3

首先先确定一下思路,思路不一样后面可能会不太好搞

背包求f[i][j]表示从i到j最优值,然后g[i][j]表示直到i分了j组最优值,g[i][j]=max{g[j-1][k-1]+f[j][i]}

(感觉这个思路对我不太友好啊,我不怎么习惯这种思路

然后呢其实求f[i][j]的背包是可以重复使用的,只要最后结算到f[i][j]的时候使用的是j的上限即可

这个就需要知道背包如果不限制必须装满的话f[容量]就是最大值,因为不必从0开始装(我在做这道题之前还真不知道……
似乎可以用有理有据的底层优化n^4卡过?

可以尝试一下

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<vector>
 7 using namespace std;
 8 int rd(){int z=0,mk=1;  char ch=getchar();
 9     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)mk=-1;  ch=getchar();}
10     while(ch>=‘0‘&&ch<=‘9‘){z=(z<<3)+(z<<1)+ch-‘0‘;  ch=getchar();}
11     return z*mk;
12 }
13 int n,m,c,a[210],b[210];
14 int f[8100],g[210][210],h[210][210];
15 int main(){//freopen("ddd.in","r",stdin);
16     cin>>n>>m>>c;
17     for(int i=1;i<=n;++i)  a[i]=rd(),b[i]=rd();
18     for(int i=1;i<=n;++i){
19         memset(f,0,sizeof(f));
20         int w=(n-i+1)*c;
21         for(int j=i;j<=n;++j){
22             for(int k=w;k>=a[j];--k)
23                 f[k]=max(f[k],f[k-a[j]]+b[j]);
24             g[i][j]=f[(j-i+1)*c];
25         }
26     }
27     for(int i=1;i<=n;++i)
28         for(int k=1;k<=m && k<=i;++k)
29             for(int j=k;j<=i;++j)
30                 h[i][k]=max(h[i][k],h[j-1][k-1]+g[j][i]);
31     cout<<h[n][m]<<endl;
32     return 0;
33 }

时间: 2024-10-12 09:01:50

关灯问题的相关文章

IOS 关灯游戏

一, 首先为window创建根视图控制器 在AppDelegate.h文件中 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions //为window创建根视图控制器 RootViewController *rootViewController = [[RootViewController alloc]init]; self.wind

小代码 链表实现关灯游戏2

/* cout << " *****************game by  ring light**************************" << endl;     cout << " **** 一个全开的循环串联灯链   为节约资源等待你的关灯动作******" << endl;     cout << " *****提示: 当选择一盏灯时,该灯及旁边的灯状态均会发生变化****&

关灯看视频(Turn Off the Lights)

插件介绍 随着使用互联网的人越来越多在网络上看视频已是常事一些相关的软件就运应而生今天为大家推荐一个能够提高用户们看视频体验的插件.关灯看视频Turn Off the Lights观看视频时自动调暗页面让您仿佛置身于电影院中只要轻轻按下灯的开关页面就会暗淡下去. 然后您就可以专心享受视频了. 再按一次开关页面就会恢复回原来的样子.Turn Off the Lights是一个轻量而实用的插件它为更舒适的观看体验而设计. 它适用于所有已知的视频网站例如 YouTube. Vimeo. Dailymo

睡觉请关灯 &nbsp; 游戏模拟实现

 首先,关于这个的基本讨论已过一阶段了.现在就是合成版  以后做mcf java等的界面. 留了 一个bug就是 电脑解决完后 会多打印几个矩阵. 改进的地方,1:增加了一种电脑解法,         2:记录用了自增栈   #include"c.h" #include"c++.h" #define  MAX  5 #define N   10 typedef int  elem_type;   class Stack { public:   Stack()  { 

[某鸥实训记][objective-c][第二天][作业]黑白棋+关灯游戏

自己写的..所以可能没什么逻辑性...可能特别水... 环境为ios SDK8.0 选择的Simulator是iPhone6 创建ios SingleViewApplication..然后再ViewController.m中的代码就是全部了 1 // 2 // ViewController.m 3 // 黑白棋0908 4 // 5 // Created by ******* on 15/9/8. 6 // Copyright (c) 2015年 *******. All rights rese

解答之终极版 &nbsp; 睡觉请关灯

首先,关于这个的基本讨论已过一阶段了.现在就是合成版  以后做mcf java等的界面. 留了 一个bug就是 电脑解决完后 会多打印几个矩阵. 改进的地方,1:增加了一种电脑解法, 2:记录用了自增栈.   #include"c.h" #include"c++.h" #define  MAX  5 #define N   10 typedef int  elem_type;   class Stack { public:  Stack() {  top = 0;

睡觉请关灯

 解答之终极版   睡觉请关灯 2016-04-01 18:18:12 标签:游戏 添加标签>> 首先,关于这个的基本讨论已过一阶段了.现在就是合成版  以后做mcf java等的界面. 留了 一个bug就是 电脑解决完后 会多打印几个矩阵. 改进的地方,1:增加了一种电脑解法,         2:记录用了自增栈.          #include"c.h" #include"c++.h" #define  MAX  5 #define N   10

小游戏 Lights Out (关灯) 的求解 —— 异或方程组

Author : Evensgn  Blog Link : http://www.cnblogs.com/JoeFan/ Article Link : http://www.cnblogs.com/JoeFan/p/4338003.html   游戏介绍 Lights Out (关灯)是一款据说在20世纪90年代就已经被设计出的小游戏,游戏的玩法十分简单. 首先,给定一个 n 行 m 列的矩形方格阵,每个格子上都有一盏灯. 初始时,有些灯是开着的,有些灯是关着的. 玩家每次进行一次操作,选中一盏

[ACM] POJ 1218 THE DRUNK JAILER (关灯问题)

THE DRUNK JAILER Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23246   Accepted: 14641 Description A certain prison contains a long hall of n cells, each right next to each other. Each cell has a prisoner in it, and each cell is locked

【算法设计与分析基础】关灯游戏

① R.java  用于存储一些全局变量 package lightoff; public class R { /* public static int lightCondition[][] = { {1,0,0,1,1}, {1,0,0,1,1}, {1,0,0,1,1}, {1,0,0,1,1}, }; */ public static int lightCondition[][] = { {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, }; //灯面