1.长城守卫(Beijing Guards,CERC 2004,LA3177)
长城守卫
Description
有 nn 个人围成一个圈,其中第 ii 个人想要有 riri 个不同的礼物。
相邻的两个人可以聊天,炫耀自己的礼物。
如果两个相邻的人拥有同一种礼物,则双方都会很不高兴。
问:一共需要多少种礼物才能满足所有人的需要?
假设每种礼物有无穷多个,不相邻的两个人不会一起聊天,所以即使拿到相同的礼物也没关系。
比如,一共有 55 个人,每个人都要一个礼物,则至少要 33 种礼物。
如果把这 33 种礼物编号为 1,2,31,2,3 ,则5个人拿到的礼物应分别是:1,2,1,2,31,2,1,2,3。
如果每个人要两个礼物,则至少要 55 种礼物,且 55 个人拿到的礼物集合应该是:
{1,2},{3,4},{1,5},{2,3},{4,5}{1,2},{3,4},{1,5},{2,3},{4,5}。
Input
输入包含多组数据。每组数据的第一行为一个整数 nn ;
以下 nn 行按照圈上的顺序描述每个人的需求,其中每行为一个整数 riri,表示第 ii 个人想要 riri 个不同的礼物。
输入结束标志为 n=0n=0。
Output
对于每组数据,输出所需礼物的种类数。
Sample Input
3
4
2
2
5
2
2
2
2
2
5
1
1
1
1
1
0
Sample Output
8
5
3
HINT
对于 100%100% 的数据,1≤n≤1051≤n≤105,1≤ri≤105
如果n为1,则答案为r[1];(注意此处的特判)
如果n为偶数,则答案为相邻的两个人的r值之和的最大值;
如果n为奇数,:(敲黑板)
假设需要p个礼物,设第一个人的礼物种类在1~r1,则最优的分配策略为:编号为偶数的人应尽量往前取,编号为奇数的人应尽量往后取。这样,编号为n的人在不冲突的情况下,尽可能的往后取rn样东西,最后判定编号为1的人和编号为n的人是否冲突即可。
记录每个人在【1~r1】的范围内取几个,在【r1+1~n】的范围内取几个,分别用left[]和right[]数组表示
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int n,r[maxn],le[maxn],ri[maxn];
bool test (int p)
{
int x=r[1],y=p-r[1];
le[1]=x;ri[1]=0;
for(int i=2;i<=n;i++)
{
if(i%2==1)
{
ri[i]=min(y-ri[i-1],r[i]);
le[i]=r[i]-ri[i];
}
else
{
le[i]=min(x-le[i-1],r[i]);
ri[i]=r[i]-le[i];
}
}
return le[n]==0;
}
int main()
{
while(cin>>n&&n!=0)
{
for(int i=1;i<=n;i++)
cin>>r[i];
if(n==1) cout<<r[1]<<endl;//注意此处的特判
r[n+1]=r[1];
int L=0,R=0;
for(int i=1;i<=n;i++)
L=max(L,r[i]+r[i+1]);
if(n%2==1)
{
for(int i=1;i<=n;i++)
R=max(R,r[i]+3);
while(L<R)
{
int M=L+(R-L)/2;
if(test(M))
R=M;
else
L=M+1;
}
}
cout<<L<<endl;
}
return 0;
}
与此解法相类同的还有:组装电脑(Assemble,NWERC2007,LA3971)
Description
你有 bb 块钱,想要组装一台电脑。给出 nn 个配件各自的种类、品质因子和价格,要求每种类型的配件各买一个,总价格不超过 bb,且“品质最差配件”的品质因子应尽量大。
Input
输入的第一行为测试数据组数 TT(T≤100T≤100)。
每组数据的第一行为两个正整数 nn(1≤n≤10001≤n≤1000)和 b(1≤b≤109)b(1≤b≤109),即配件的数目和预算;
以下 nn 行每行描述一个配件,依次为种类、名称、价格和品质因子。
其中,价格为不超过 106106 的非负整数;
品质因子是不超过 109109 的非负整数(越大越好);
种类和名称则又不超过 2020 个字母、数字和下划线组成。
输入保证总是有解。
Output
对于每组数据,输出配件最小品质因子的最大值。
Sample Input
1
18 800
processor 3500_MHz 66 5
processor 4200_MHz 103 7
processor 5000_MHz 156 9
processor 6000_MHz 219 12
memory 1_GB 35 3
memory 2_GB 88 6
memory 4_GB 170 12
mainbord all_onboard 52 10
harddisk 250_GB 54 10
harddisk 500_FB 99 12
casing midi 36 10
monitor 17_inch 157 5
monitor 19_inch 175 7
monitor 20_inch 210 9
monitor 22_inch 293 12
mouse cordless_optical 18 12
mouse microsoft 30 9
keyboard office 4 10
Sample Output
9