1062.Talent and Virtue (25)

1062.Talent and Virtue (25)

pat-al-1062

2017-03-01

  • 乙级做过,这次又做了一遍,感觉流畅多了,并做了优化
  • 利用state来保存等级(sage、nobleman、foolman和其他),在比较函数cmp中直接利用这个排序,就不必将四种学生分在四个数组里了
  • 利用vector来保存
/**
 * pat-al-1062
 * 2017-03-01
 * Cpp version
 * Author: fengLian_s
 */
#include
#include
#include
#define MAX 100010
using namespace std;
struct STU
{
  int id;
  int virtue;
  int talent;
  int total;
  int state;//1是sage,2是nobleman,3是foolman,4是其他
}newStu;
bool cmp(STU a, STU b)
{
  if(a.state != b.state)
    return a.state < b.state;
  else
  {
    if(a.total != b.total)
      return a.total > b.total;
    else
    {
      if(a.virtue != b. virtue)
        return a.virtue > b.virtue;
      else
        return a.id < b.id;
    }
  }
}
int main()
{
  freopen("in.txt", "r", stdin);
  int n, l, h;
  scanf("%d%d%d", &n, &l, &h);
  int id, virtue, talent, cnt = 0;
  vector stu;
  for(int i = 0;i < n;i++)
  {
    scanf("%d%d%d", &id, &virtue, & talent);
    if(virtue >= l && talent >= l)
    {
      cnt++;
      newStu.id = id;
      newStu.virtue = virtue;
      newStu.talent = talent;
      newStu.total = virtue + talent;
    }
    else
      continue;
    if(virtue >= h && talent >= h)
      newStu.state = 1;
    else if(virtue >=h && talent < h)
      newStu.state = 2;
    else if(virtue < h && talent < h && virtue >= talent)
      newStu.state = 3;
    else
      newStu.state = 4;
    stu.push_back(newStu);
    //printf("%08d %d\n", newStu.id, newStu.state);
  }
  sort(stu.begin(), stu.end(), cmp);
  // printf("%08d %d %d %d\n", stu[0].id, stu[0].virtue, stu[0].talent, stu[0].state);
  // for(int i = 1;i < cnt;i++)
  // {
  //   printf("%08d %d %d %d\n", stu[i].id, stu[i].virtue, stu[i].talent, stu[i].state);
  // }
  if(cnt != 0)
    printf("%d\n", cnt);
  else
  {
    printf("0\n");
    return 0;
  }
  printf("%08d %d %d\n", stu[0].id, stu[0].virtue, stu[0].talent);
  for(int i = 1;i < cnt;i++)
  {
    printf("%08d %d %d\n", stu[i].id, stu[i].virtue, stu[i].talent);
  }
  return 0;
}

-FIN-

你可能感兴趣的:(pat)