您的位置:首页 > 其它

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

2015-09-22 10:39 453 查看

Clarke and minecraft

Accepts: 304

Submissions: 777

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

问题描述
克拉克是一名人格分裂患者。某一天,克拉克分裂成了一个游戏玩家,玩起了minecraft。渐渐地,克拉克建起了一座城堡。
有一天,克拉克为了让更多的人分享自己的成果,开了局域网,并且选择创造模式。不幸的是,这一天有一个熊孩子进了克拉克的游戏,他在克拉克的城堡里放了很多个爬行者!当刚刚去外面打怪回、开着生存模式的克拉克回到城堡中的一瞬间,爬行者们突然自爆......(自行脑部画面)于是克拉克的城堡变成了一片废墟,圆石、木板、砖块等建筑材料撒落了一地。
无奈的克拉克只好拾起这些废墟,准备重建。克拉克建了足够的箱子后,想自己把这些散落的材料都搬运道箱子里。克拉克清楚的记得自己建的每一个东西当初用了多少材料以及材料的种类。现在克拉克想知道,克拉克至少需要搬运多少次,才能将所有的材料全部搬到箱子里。
注:材料可以堆叠,一个格子最多可以容纳64个相同材料。不同物品的材料可以在一次运输到箱子中。minecraft中背包栏一共有4*9=36个格子。

输入描述
第一行一个整数T(1 \le T \le 10)T(1≤T≤10),表示数据的组数。
每组数据第一行是一个正整数n(1 \le n \le 100)n(1≤n≤100),表示东西的数量。
接下来nn行,每一行有两个正整数a, b(1 \le a, b \le 500)a,b(1≤a,b≤500),aa表示这个东西的材料的种类,bb表示这种材料的数量。

输出描述
对于每组数据,输出一个整数,表示克拉克至少搬运的次数。

输入样例
2
3
2 33
3 33
2 33
10
5 467
6 378
7 309
8 499
5 320
3 480
2 444
8 391
5 333
100 499

输出样例
1
2

Hint
第一个样例,对于2号物品我们用2格来放,3号物品单独放,总共需要3个格子,运输1次。

贪心..尽量把一样的材料放在一起...
然后写蠢了..妈蛋...
详情见代码


/*************************************************************************
> File Name: code/bc/#56/1001.cpp
> Author: 111qqz
> Email: rkz2013@126.com
> Created Time: 2015年09月19日 星期六 18时55分49秒
************************************************************************/

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
#include<cctype>
#define y1 hust111qqz
#define yn hez111qqz
#define j1 cute111qqz
#define ms(a,x) memset(a,x,sizeof(a))
#define lr dying111qqz
using namespace std;
#define For(i, n) for (int i=0;i<int(n);++i)
typedef long long LL;
typedef double DB;
const int inf = 0x3f3f3f3f;
const int N=5E2+7;
int a
,b
;
int ans,cnt;
int p
;
int n;
int main()
{
#ifndef  ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int T;
cin>>T;
while (T--)
{
ans  = 0;
cnt  = 0;
ms(p,0);
scanf("%d",&n);
for ( int i = 0 ; i < n ; i++ )
{
scanf("%d %d",&a[i],&b[i]);
p[a[i]]+=b[i];
}
int kind =  0;
for ( int i = 1 ;i <= 500 ; i++)
{
if (p[i]!=0)
{
//    cnt = cnt + (p[i]-1)/64 + 1;
cnt = cnt + (p[i]+63)/64;  //这样写不知高到哪里去了.
p[i] = 0;
}

}
//ans = ans + (cnt-1)/36+1;
ans = (cnt+35)/36; //不知高到哪里去了...
printf("%d\n",ans);

}

#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: