您的位置:首页 > 其它

算法提高 盾神与积木游戏

2018-03-06 22:37 225 查看
  算法提高 盾神与积木游戏  时间限制:1.0s   内存限制:256.0MB     问题描述  最近的m天盾神都去幼儿园陪小朋友们玩去了~
  每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西。但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小朋友的积木才能完成他的大作。如果某个小朋友完成了他的作品,那么他就会把自己的作品推倒,而无私地把他的所有积木都奉献出来;但是,如果他还没有完成自己的作品,他是不会把积木让出去的哟~
  盾神看到这么和谐的小朋友们感到非常开心,于是想帮助他们所有人都完成他们各自的作品。盾神现在在想,这个理想有没有可能实现呢?于是把这个问题交给了他最信赖的你。输入格式  第一行为一个数m。
  接下来有m组数据。每一组的第一行为n,表示这天有n个小朋友。接下来的n行每行两个数,分别表示他现在拥有的积木数和他一共需要的积木数。输出格式  输出m行,如果第i天能顺利完成所有作品,输出YES,否则输出NO。样例输入2
2
2 2
1 3
3
1 5
3 3
0 4样例输出YES
NO数据规模和约定  1<=n<=10000,1<=m<=10。

代码:    
#include<iostream>
#include<algorithm>
#include<stack>
#include<iomanip>
#include<queue>
#include<cmath>
using namespace std;
int Sum=0;//保留可用的积木
struct C {
int data1;
int data2;
int differ;//difference相差
};
bool  cmp(const C &x, const C &y)
{
return x.differ<y.differ;//从小到大排<,若要从大到小排则>
}
int main() {
int n;//几组
int num;//一组中有几对数据
cin >> n ;
C * Array = new C[20000];//
for (int i = 0; i < n;i++) {
cin >> num;
for (int i = 0; i < num; i++) {
cin >> Array[i].data1 >> Array[i].data2;
Array[i].differ = Array[i].data2 - Array[i].data1;
}
sort(Array, Array + num,cmp);//
for (int i = 0; i < num;i++) {
//可以拼好的情况
if (Array[i].differ==0) {
Sum += Array[i].data1;
continue;
}
//还需要部件的情况
Sum -= Array[i].differ;
if (Sum >= 0) {//需要部件的同学拼好了
Sum += Array[i].data2;
}
else {
cout << "NO" << endl;
break;//输出NO后需要跳出循环
}
}
if (Sum >= 0) {
cout << "YES" << endl;
}
Sum = 0;//归零!!
}
return 0;
}


思路:    贪心算法,一开始打算用面向过程的方法去写,不太会构想,直接用面向对象的吧!struct相对简单的(没用类)。先将输入的数据进行排序,根据data1和data2的差值(还差多少积木)进行排序,差的越少就越靠前! 拼好的将部件都放到Sum中供后面的同学使用(Sum在一组数用完了后要记得清0)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: