↓ 跳过正文
  1. Posts/

codeforces #334 div 2 B. More Cowbell

·431 字·1 分钟

题意是说。给n个balls,k个箱子。保证(n<=2*k) 一个箱子中中最多放两个balls,size为两个balls的size之和。 所有的箱子的size都要一样。 问size最小是多少。

只要让最大的size尽可能小即可。 容易想到一组贪心策略。 可以先看有几个多出来的位置 (2*k-n) 然后把最大的几个size的ball装在多余的位置里。。更新答案。 然后对于剩下的。。。最小的和最大的一组状进去。。。扫一遍更新答案。

代码实现
 1/* ***********************************************
 2Author :111qqz
 3Created Time :2015年12月02日 星期三 00时00分22秒
 4File Name :code/cf/#334/B.cpp
 5************************************************ */
 6
 7#include <cstdio>
 8#include <cstring>
 9#include <iostream>
10#include <algorithm>
11#include <vector>
12#include <queue>
13#include <set>
14#include <map>
15#include <string>
16#include <cmath>
17#include <cstdlib>
18#include <ctime>
19#define fst first
20#define sec second
21#define lson l,m,rt<<1
22#define rson m+1,r,rt<<1|1
23#define ms(a,x) memset(a,x,sizeof(a))
24typedef long long LL;
25
26
27
28using namespace std;
29const double eps = 1E-8;
30const int dx4[4]={1,0,0,-1};
31const int dy4[4]={0,-1,1,0};
32const int inf = 0x3f3f3f3f;
33const int N=1E5+7;
34int n,k;
35int s[N];
36int a[N];
37int main()
38{
39	#ifndef  ONLINE_JUDGE
40	freopen("code/in.txt","r",stdin);
41  #endif
42	ms(s,0);
43	ms(a,0);
44	scanf("%d %d",&n,&k);
45	for ( int i = 1 ; i <= n ; i++)
46	     scanf("%d",&s[i]);
47	int duoyu = k*2-n;
48//	cout<<"duoyu:"<<duoyu<<endl;
49	int nn = n - duoyu;
50//	cout<<"nn:"<<nn<<endl;
51	int ans = -1;
52	for ( int i = nn+1 ; i <= n;i++) ans = max(ans,s[i]);
53	for ( int i = 1 ; i <= nn/2 ; i++)
54	{
55	    ans = max(ans,s[i]+s[nn-i+1]);
56//	    cout<<"i:"<<i<<" "<<s[i]<<endl;
57//	    cout<<"nn-i+1"<<nn-i+1<<" s[nn-i+1]:"<<s[nn-i+1]<<endl;
58	}
59	cout<<ans<<endl;
60
61
62  #ifndef ONLINE_JUDGE
63  fclose(stdin);
64  #endif
65    return 0;
66}

相关文章

51nod_learn_greedy_活动安排2

·532 字·2 分钟
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? 1第一行一个正整数n (n <= 10000)代表活动的个数。 2第二行到第(n + 1)行包含n个开始时间和结束时间。 3开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000 输出 一行包含一个整数表示最少教室的个数。 输入示例

best coder #56 div 2 A Clarke and minecraft(贪心)

·303 字·1 分钟
贪心..尽量把一样的材料放在一起... 然后写蠢了..妈蛋... 详情见代码 代码实现 1/************************************************************************* 2 > File Name: code/bc/#56/1001.cpp 3 > Author: 111qqz 4 > Email: rkz2013@126.com 5 > Created Time: 2015年09月19日 星期六 18时55分49秒 6 ************************************************************************/ 7 8#include<iostream> 9#include<iomanip> 10#include<cstdio> 11#include<algorithm> 12#include<cmath> 13#include<cstring> 14#include<string> 15#include<map> 16#include<set> 17#include<queue> 18#include<vector> 19#include<stack> 20#include<cctype> 21#define y1 hust111qqz 22#define yn hez111qqz 23#define j1 cute111qqz 24#define ms(a,x) memset(a,x,sizeof(a)) 25#define lr dying111qqz 26using namespace std; 27#define For(i, n) for (int i=0;i<int(n);++i) 28typedef long long LL; 29typedef double DB; 30const int inf = 0x3f3f3f3f; 31const int N=5E2+7; 32int a[N],b[N]; 33int ans,cnt; 34int p[N]; 35int n; 36int main() 37{ 38 #ifndef ONLINE_JUDGE 39 freopen("in.txt","r",stdin); 40 #endif 41 int T; 42 cin>>T; 43 while (T--) 44 { 45 ans = 0; 46 cnt = 0; 47 ms(p,0); 48 scanf("%d",&n); 49 for ( int i = 0 ; i < n ; i++ ) 50 { 51 scanf("%d %d",&a[i],&b[i]); 52 p[a[i]]+=b[i]; 53 } 54 int kind = 0; 55 for ( int i = 1 ;i <= 500 ; i++) 56 { 57 if (p[i]!=0) 58 { 59 // cnt = cnt + (p[i]-1)/64 + 1; 60 cnt = cnt + (p[i]+63)/64; //这样写不知高到哪里去了. 61 p[i] = 0; 62 } 63 64 } 65 //ans = ans + (cnt-1)/36+1; 66 ans = (cnt+35)/36; //不知高到哪里去了... 67 printf("%d\n",ans); 68 69 70 } 71 72 73 #ifndef ONLINE_JUDGE 74 fclose(stdin); 75 #endif 76 return 0; 77}

codeforces 558c Amr and Chemistry (贪心)

·759 字·2 分钟
http://codeforces.com/contest/558/problem/C 题目大意是说,给定N个数,可以对任意数进行任意次两种操作,×2,和/2(整除) 问最少操作多少次,可以让所有数相等。 嘛,前半个小时A掉了前两个提,d E貌似都是线段树。。并不会。。。就一直搞C。。。。