BestCoder Round #56/hdu5463 Clarke and minecraft 水题
Clarke and minecraft
问题描述
克拉克是一名人格分裂患者。某一天,克拉克分裂成了一个游戏玩家,玩起了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次。
水
//1085422276 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<cmath> #include<map> #include<bitset> #include<set> #include<vector> #include<stack> using namespace std ; typedef long long ll; #define mem(a) memset(a,0,sizeof(a)) #define meminf(a) memset(a,127,sizeof(a)); #define memfy(a) memset(a,-1,sizeof(a)) #define TS printf("111111\n"); #define FOR(i,a,b) for( int i=a;i<=b;i++) #define FORJ(i,a,b) for(int i=a;i>=b;i--) #define READ(a,b) scanf("%d%d",&a,&b) #define mod 530600414 #define maxn 506 inline ll read() { ll x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } //**************************************** int G[maxn],n; int main() { int T=read(); while(T--) { scanf("%d",&n); mem(G); int a,b; FOR(i,1,n) { scanf("%d%d",&a,&b); G[a]+=b; } int ans=0; for(int i=1;i<=500;i++) { if(G[i]) { ans+=G[i]/64; G[i]=G[i]%64; if(G[i])ans++; } } int sum=0; if(ans%36) sum+=1; sum+=ans/36; cout<<sum<<endl; } return 0; }