本周学习了贪心,我用贪心做了一道特别简单的题:
题目:选球员,两队的教练分别选技巧值不同的球员(正常的教练都会从高的开始选),描述完毕。
好吧,接下来回到正题,程序如下:
-
#include<bits/stdc++.h> using namespace std; bool mmp(int c){ if(c%2==1) return 1; else return 0; } int main() { long long a,b[100000],e,f; cin>>a; for(int i=1;i<=a;i++) { cin>>b[i]; } sort(b+1,b+a+1); for(int j=1;j<=a;j++) { if(mmp(j)) { e+=b[j]; } else { f+=b[j]; } } if(e-f>=0) { cout<<e-f<<endl; } else if(e-f<0) { cout<<f-e<<endl; } return 0; }
分析:首先定义一个函数,函数的内容是用来将两队的选择分开,即一个教练选完是另一个教练选择,然后输入每个球员的技巧值,将技巧值从大到小排序,e为A队的选择的队员技巧值总值,f为B队的选择的球员技巧值总值,由于可能有队员技巧值相同,所以每一队的技巧之总值的大小是不一定的(简单地说,可能是A大,也可能是B队大)理解如下:
-
#include<bits/stdc++.h> using namespace std; bool mmp(int c){ if(c%2==1)//隔开两个教练的选择,即排序后,所有编号为奇数的队员们都属于A队教练,所有编号为偶数的都为B队队员; return 1; else return 0; } int main() { long long a,b[100000],e,f; cin>>a; for(int i=1;i<=a;i++) { cin>>b[i];//输入每个队员的技巧值; } sort(b+1,b+a+1);//将待选队员们的技巧值从大到小排序,方便教练选择(O(∩_∩)O~) for(int j=1;j<=a;j++)//这个循环为开始分配每一名队员; { if(mmp(j))//如果编号为奇数,那么这个队员就属于A队教练了; { e+=b[j];//A队总技巧值加上这名队员的技巧值; } else//如果编号不是奇数,即为偶数,那么这个队员就属于B队; { f+=b[j];//B队总技巧值加上这名队员的技巧值; } } if(e-f>=0) { cout<<e-f<<endl;//如果A队的总技巧值大于B队的总技巧值,那么他们的差即为A队总技巧值减去B队总技巧值; } else//也有可能B队总技巧值大于A队的总技巧值,那么差即为B队总技巧值减去A队总技巧值; if(e-f<0) { cout<<f-e<<endl; } return 0; }
还有一道更不需要用脑子的题目,但是这些题目都是属于数组的标签里的。。
题目如下:
输入一串数,统计这串数里每种数字的个数,代码如下:
-
(又臭又长?)#include<bits/stdc++.h> using namespace std; int main() { long int a,b[1000000],c=1;//此处的C代表某一种数的个数,将C开始赋值为1,是为了后面统计时,将最开始的那一个遗漏的也加上; cin>>a;//输入数字的总个数; for(int i=1;i<=a;i++) { cin>>b[i];//输入每个数字; } sort(b+1,b+a+1);//将这一大坨数字从小到大排序,排序之后,相同的数会排在一起; for(int j=1;j<=a;j++) { if(b[j]==b[j+1])//如果这个与他后面的那个数相等; { c++;//那么这个数的种类加1; } else//如果这个数与他后面的数已经不相同了,说明该数已经是最后一个了,即为两种数字的分界点; { cout<<b[j]<<' '<<c<<endl;//由于该数字已经到达了分界点,可以直接输出该数字和他的个数,重新开始统计下一个数字; c=1;//统计之前,将C复原; } } return 0; }