分组均衡性
在上机实验课上,老师将所有学生排列为 n 排,每排坐 m 个学生。每个学生有左右两个邻座(除了这一排的左右两端)。每个人可以和自己的邻座互相帮助完成实验。除了每排左右两端的学生,中间的每个学生都可以同时与两个邻座分别协作。
由于每个学生的个人能力不同,假设协作产生的小组能力值是两个协作学生的能力值之和,老师希望知道,自己给出的座位安排在多大程度上是“均衡”的 —— 所谓分组均衡性,是指所有可能组成的协作小组的能力值的最大值与最小值之差。
给定一张座位安排表,请计算这个安排的分组均衡性。
时间限制:1000
内存限制:65536
输入
输入第一行给出 2 个正整数 n 和 m(2 ≤ n, m ≤ 100),依次为座位的排数和每排的人数。 随后 n 行,每行给出 m 个数字,代表对应座位上学生的能力值(为区间 [1, 100] 内的整数)。同行数字间以空格分隔。
输出
在一行中输出分组均衡性。
样例输入
3 5 10 80 30 95 60 79 55 63 84 41 98 23 72 85 58样例输出
67提示
样例解释:最强组合是第 3 排的 72+85=157;最弱组合是第 1 排的 10+80=90。因此两者之差为 67。
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[110][110];
int n,m;
cin>>n>>m;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
}
}
int f = 0;
int p = 9999999;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m-1;j++)
{
int x = a[i][j] + a[i][j+1];
f = max(f,x);
p = min(p,x);
}
}
cout<<f-p;
return 0;
}
增高垫
网传最大号的增高垫有 16 厘米,可以一下把 1.64 米的男孩变成一米八的大汉,不少对自己身高缺乏自信的男生女生会悄悄买来穿,特别是大家站成一排拍照的时候。
假设准备拍照的一排人中,只要有人看到身边紧挨着的人比自己高,就会忍不住穿增高垫,并且一定要比人家多穿一层。你的任务就是在看过这一排人的身高后,算出谁穿了最多层的增高垫。
时间限制:1000
内存限制:65536
输入
输入首先在第一行给出正整数 n(≤ 104),为一排人的个数。随后一行给出 n 个正整数,表示 n 个人的身高(厘米)。每个数值是不超过 300 的正整数,数字间以空格分隔。
输出
在一行中输出穿了最多层增高垫的人的位置和穿的层数(位序从左到右,从 1 开始)。如果有并列,按从左到右的顺序,每个人的信息占一行。
样例输入
10 150 160 186 200 170 175 180 186 186 183样例输出
1 3 5 3
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[10001];
int b[10001];
int c[10001];
int n;
cin>>n;
for(int i = 1;i<=n;i++)
{
cin>>a[i];
}
b[0] = 1;
b[n+1] = 1;
int cnt = 0;
for(int i = 1;i<=n;i++)
{
if(a[i]>=a[i+1] && a[i]>=a[i+1]) b[i] = 1;
}
for(int i = n+1;i>=0;i--)
{
if(b[i]==1)
{
cnt = 0;
}
c[i] = cnt;
cnt++;
}
int ma = -1;
for(int i = 1;i<=n;i++)
{
ma = max(ma,c[i]);
}
for(int i = 1;i<=n;i++)
{
if(c[i] == ma)
{
cout<<i<<" "<<c[i]<<endl;
}
}
return 0;
}
三元组的离心力
三元组 (a,b,c) 的“离心力”定义为 |a-b|+|b-c|+|c-a|。现给定三个非空的整数集合 S1、S2、S3,请你找出所有跨这三个集合的三元组 (a,b,c)(即 a∈ S1,b∈ S2,c∈ S3)的最小离心力。
时间限制:1000
内存限制:65536
输入
输入第一行给出三个不超过 104 的正整数 n1、n2、n3,依次为集合 S1、S2、S3 中元素的个数(注意一个集合内没有相同的元素)。随后三行,顺次给出三个集合的元素,均为 [-104 , 104] 内的整数。同行数字间以空格分隔。
输出
在一行中输出 `LiXinLi(a, b, c) = d`,其中 `(a, b, c)` 是具有最小离心力的三元组,`d` 是对应的离心力。如果解不唯一,输出那个最大的解。 注意:(a1,a2,a3)>(b1,b2,b3) 是指,存在 1 ≤ k ≤ 3 使得 ai=bi 对 1 ≤ i < k 成立,并且 ak > bk。
样例输入
4 4 6 0 9 -1 11 10 -25 11 -10 9 2 41 17 12 30样例输出
LiXinLi(11, 11, 12) = 2提示
注意到样例实际上有两组解,另外一组解是 (9, 10, 9)。因为 (11, 11, 12) 比较大,所以输出的是这组解。
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
int n1,n2,n3;
int a[110];
int b[110];
int c[110];
int x,y,z = 0;
int main()
{
cin>>n1>>n2>>n3;
for(int i = 0;i<n1;i++)
{
cin>>a[i];
}
for(int i = 0;i<n2;i++)
{
cin>>b[i];
}
for(int i = 0;i<n3;i++)
{
cin>>c[i];
}
int p = 9999;
for(int i = 0;i<n1;i++)
{
for(int j = 0;j<n2;j++)
{
for(int k = 0;k<n3;k++)
{
p = min(p,(a[i]-b[j])+(b[j]-c[k])+(c[k]-a[i]));
x = a[i];
y = b[j];
z = c[z];
}
}
}
cout<<"lixinli"<<"("<<x<<","<<y<<","<<z<<")"<<" "<<"="<<" "<<p;
return 0;
}
分玩具
已知 n 位小朋友对 m 件玩具的喜好(n ≤ m),现要将 m 件玩具分给 n 位小朋友,每位小朋友只能分到 1 件玩具,每件玩具也最多只能分给 1 位小朋友,并且还要求每位小朋友都能分到自己喜欢的玩具。
本题请你对任意 n 和 m 尝试列出所有满足要求的方案。
时间限制:5000
内存限制:65536
输入
输入第一行给出两个正整数 n 和 m(n ≤ m ≤ 8),即小朋友人数和玩具的数量。 随后 n 行,每行给出 m 个数字。其中第 i 行第 j 个数字为 1 表示第 i 位小朋友喜欢第 j 件玩具,为 0 则表示不喜欢。
输出
按升序列出所有满足要求的方案,格式为 (s1, … , sn)。其中 si 表示第 i 位小朋友分到了第 si 件玩具。 注:方案 (a1, … , an) < (b1, … , bn) 是指存在 1 ≤ k ≤ n,使得 ai = bi 对所有 1 ≤ i< k 成立,并且有 ak < bk。
样例输入
4 5 0 1 0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1样例输出
(2, 1, 3, 4) (2, 1, 3, 5) (2, 1, 4, 5) (2, 4, 1, 5) (2, 4, 3, 5) (5, 1, 3, 4) (5, 2, 1, 4) (5, 2, 3, 4)
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
int a[10];
bool b[10];
bool c[10][10];
int n,m;
void func(int k);
int main()
{
cin>>n>>m;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
cin>>c[i][j];
}
}
func(1);
return 0;
}
void func(int k)
{
if(k>n)
{
cout<<"(";
for(int i = 1;i<=n;i++)
{
cout<<a[i]<<",";
}
cout<<")"<<endl;
return;
}
for(int i = 1;i<=m;i++)
{
if(b[i] == 0 && c[k][i] == 1)
{
a[k] = i;
b[i] = 1;
func(k+1);
b[i] = 0;
}
}
}