xtu oj 1739 神探联盟招募大作战

发布时间:2026/8/3 12:59:55

xtu oj 1739 神探联盟招募大作战 又被难住的一天其实是大一同学期中考试做的题题意大概是n个人每个人都希望自己组算上自己至少有a[i]个人问这些人最多能分几组前提必须满足每个人的要求一个人只能进一个组。有点复杂的一道题可能是问最少的题目比较多这个题比较别样问了最多所以需要大家多动动小脑瓜。虽然是同学出的但是是很不错的一道题。题目要求我们得出最大组数我们是不是可以先满足要求人数比较低的分组这样可以快速提高分组数也算是贪心的思维再去理会那些比较难搞的人。所以我们先给要求人数进行升序排序从前到后遍历运用一个变量cnt记录当前组内人数还有ans记录组号如果当前遍历到的这个人的要求比当前人数高就把他放进当前这个组我们可以用一个二维数组存储这些人。如果放入这个人以后组内人数已经达到他的要求我们就continue遍历下一个人并且把组号anscnt重新置为0。直到所有人都分好组重点来了也就是为什么我们要单独设一个二维数组去记录这些分组比如1 3 3 3 5或者是题目给的样例最后一组的人都没有满足他们的要求这时候我们t只能从后往前去合并先数最后一组最后一个数减去当前组内人数还差t个人就满足因为最后一个数肯定是最大的满足了他也就满足了前面的人。然后我们从倒数第二组一组一组往前遍历用一个变量u加人数直到大于等于差值t跳出循环。#include stdio.h #include string.h #include stdlib.h int a[200]; int s[200][200]; int cmp(const void *a,const void *b){ int aa*(int *)a; int bb*(int *)b; if(aabb){ return 1; } else if(aabb){ return -1; } else return 0; } int main(){ memset(s,0,sizeof(s)); int n; scanf(%d,n); for(int i0;in;i){ scanf(%d,a[i]); } qsort(a,n,sizeof(a[0]),cmp); int ans0;//第几组 int cnt0;//组内人数 for(int i0;in;i){ if(cnta[i]){ s[ans][cnt]a[i]; cnt; } if(cnta[i]){//封装这一组 ans; cnt0; } } if(cnt0){//恰好可以分完 比如1 1也就是最后一组都能满足自己要求 printf(%d\n,ans); return 0; } int ts[ans][cnt-1]-cnt; //printf(%d\n,t); int u0; int yans;//除去最后一组的组数 for(int ians-1;i0;i--){ for(int j0;j200;j){ if(s[i][j]!0){ u; } else break;//不写就是95分 } y--;//拆了一组 if(ut){ y;//合起来又是新的一组 break; } } printf(%d\n,y); }个人感觉怎么分组那段代码是精华(*^_^*)

相关新闻