(money/money.in/money.out)
时限1000ms 内存256MB
聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi。有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权!(因为聪哥是土豪,他是老板的老板)
聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间,使他一次性拿的钱中最大的最小。(最后一天一定要领钱)
输入
第一行 2个数 n,m
接下来n行,每行一个数,代表Vi.
输出
最小的最大钱数。
样例输入
7 5
100
400
300
100
500
101
400
样例输出
500
样例说明
100 400//300 100//500//101//400//
“//”表示老大要去拿钱。
数据范围
20% 1<=n<=20
另 20% 1<=n<=50,Vi的和不超过1000
100% 1<=n<=100,000,m<=n,Vi<=10,000
第二题 藏妹子之处(excel)
问题描述:
今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格。但要满足如下的两个条件:
(1)任意两个单元格都不在同一行。
(2)任意两个单元格都不在同一列。
选取格子存在一个花费,而这个花费是三个格子两两之间曼哈顿距离的和(如(x1,y1)和(x,y2)的曼哈顿距离为|x1-x2|+|y1-y2|)。狗狗想知道的是,花费在minT到maxT之间的方案数有多少。
答案模1000000007。所谓的两种不同方案是指:只要它选中的单元格有一个不同,就认为是不同的方案。
输入格式:
一行,4个整数,R、C、minT、maxT。3≤R,C≤4000, 1≤minT≤maxT≤20000。
对于30%的数据, 3 ≤ R, C ≤ 70。
输出格式:
一个整数,表示不同的选择方案数量模1000000007后的结果。
输入输出样例:
|
输入样例 |
3 3 1 20000
|
3 3 4 7
|
4 6 9 12 |
7 5 13 18
|
4000 4000 4000 14000 |
|
输出样例 |
6 |
0 |
264 |
1212 |
859690013
|
Problem 3 银河之星(galaxy.cpp/c/pas)
T1:
二分贪心
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #define MAXN 100005 6 #define ll long long 7 using namespace std; 8 int a[MAXN]; 9 int n,m; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0'||ch>'9'){if('-'==ch)f=-1;ch=getchar();} 13 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 int check(int w){ 17 int cnt=1,s=0; 18 for(int i=1;i<=n;i++){ 19 if(s+a[i]>w){ 20 cnt++; 21 if(cnt>m){ 22 return 0; 23 } 24 s=a[i]; 25 } 26 else{ 27 s+=a[i]; 28 } 29 } 30 return 1; 31 } 32 int main() 33 { 34 int L=0,R=0; 35 n=read();m=read(); 36 for(int i=1;i<=n;i++){ 37 a[i]=read(); 38 R+=a[i]; 39 L=max(L,a[i]); 40 } 41 while(R-L>1){ 42 int mid=((ll)R+(ll)L)/2; 43 if(check(mid)){ 44 R=mid; 45 } 46 else{ 47 L=mid+1; 48 } 49 } 50 if(check(L)){ 51 printf("%d\n",L); 52 } 53 else{ 54 printf("%d\n",R); 55 } 56 return 0; 57 }