[关闭]
@xunuo 2017-02-26T19:02:18.000000Z 字数 2653 阅读 993

HDU 5463 Clarke and minecraft


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

暴力


Description

Clarke is a patient with multiple personality disorder. One day, Clarke turned into a game player of minecraft. 
On that day, Clarke set up local network and chose create mode for sharing his achievements with others. Unfortunately, a naughty kid came his game. He placed a few creepers in Clarke's castle! When Clarke returned his castle without create mode, creepers suddenly blew(what a amazing scene!). Then Clarke's castle in ruins, the materials scattered over the ground. 
Clark had no choice but to pick up these ruins, ready to rebuild. After Clarke built some chests(boxes), He had to pick up the material and stored them in the chests. Clarke clearly remembered the type and number of each item(each item was made of only one type material) . Now Clarke want to know how many times he have to transport at least. 
Note: Materials which has same type can be stacked, a grid can store 64 materials of same type at most. Different types of materials can be transported together. Clarke's bag has 4*9=36 grids.

Input

The first line contains a number T(1≤T≤10), the number of test cases. 
For each test case: 
The first line contains a number n, the number of items. 
Then n lines follow, each line contains two integer a,b(1≤a,b≤500), a denotes the type of material of this item, b denotes the number of this material.

Output

For each testcase, print a number, the number of times that Clarke need to transport at least.

Sample Input

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

Sample Output

1
2

Hint:

The first sample, we need to use 2 grids to store the materials of type 2 and 1 grid to store the materials of type 3. So we only need to transport once;

题意:

    克拉克是一名人格分裂患者。某一天,克拉克分裂成了一个游戏玩家,玩起了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),表示东西的数量。  
    接下来n行,每一行有两个正整数a, b(1 \le a, b \le 500)a,b(1≤a,b≤500),a表示这个东西的材料的种类,b表示这种材料的数量。 
对于每组数据,输出一个整数,表示克拉克至少搬运的次数。  

解题思路:

对种类相同的材料,将它的val加起来/64;然后把sum/36;得到的就是次数

完整代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int a[110],b[110],bb[110];
  7. int main()
  8. {
  9. int t;
  10. scanf("%d",&t);
  11. while(t--)
  12. {
  13. memset(bb,0,sizeof(bb));
  14. int n;
  15. scanf("%d",&n);
  16. int k=0;
  17. for(int i=0;i<n;i++)
  18. {
  19. int flag=0;
  20. scanf("%d%d",&a[i],&b[i]);
  21. for(int j=0;j<i;j++)
  22. if(a[i]==a[j])
  23. {
  24. bb[k]+=b[i];
  25. flag=1;
  26. break;
  27. }
  28. if(flag==0)
  29. {
  30. k++;
  31. bb[k]=b[i];
  32. }
  33. }
  34. int sum=0;
  35. for(int i=1;i<=k;i++)
  36. {
  37. if(bb[i]%64==0)
  38. sum+=bb[i]/64;
  39. else
  40. sum+=bb[i]/64+1;
  41. }
  42. int ans;
  43. if(sum%36==0)
  44. ans=sum/36;
  45. else
  46. ans=sum/36+1;
  47. printf("%d\n",ans);
  48. }
  49. return 0;
  50. }

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注