打卡信奥刷题(3196)用C++实现信奥题 P8103 「LCOI2022」 Cow Merger
P8103 「LCOI2022」 Cow Merger题目背景Bessie 来到她的新家之后Farmer John 突然意识到自己农场的大小不够了所以Farmer John 需要把所有的奶牛合并到一个牛棚里。题目描述Farmer John 的农场里本来有nnn个牛棚第iii个牛棚里住着aia_iai只牛。我们定义一次合并i,j(ai≥aj)i,j(a_i\ge a_j)i,j(ai≥aj)两个牛棚的操作为从iii号牛棚中拿出aja_jaj头牛放入jjj号牛棚中。如果在合并结束后ai0a_i0ai0那么可以看做aia_iai被合并了接下来的操作也与aia_iai无关。由于时间不够了他决定最多你111秒的时间。输入格式第一行包含一个整数TTT表示数据组数。对于第ttt组数据:第2t2t2t行包含一个整数nnn。第2t12t12t1行包含nnn个整数第iii个整数为aia_iai。输出格式对于每组数据如果你发现自己不可能达到目标输出NO否则输出YES。接下来一行输出一个整数mmm表示操作次数。接下来mmm行每行输出两个数iii和jjj注意操作时应满足ai≥aja_i \ge a_jai≥aj。有多解时可输出任意一组解。输入输出样例 #1输入 #13 4 1 2 3 2 5 3 9 6 18 12 5 2 3 5 7 11输出 #1YES 4 3 1 1 2 3 4 2 4 YES 6 2 1 1 2 4 3 2 3 4 5 3 5 NO说明/提示【数据范围与约定】对于100%100\%100%的数据1≤T≤51 \leq T \leq 51≤T≤51≤n≤1051 \leq n \leq 10^51≤n≤1050≤ai≤1090 \leq a_i \leq 10^90≤ai≤109。C实现#includeiostream#includecstdio#includealgorithmusingnamespacestd;longlongn,i,t,k,a[100001],b,c,d,m,l[1000001],r[1000001];intmain(){scanf(%lld,t);for(k1;kt;kk1){scanf(%lld,n);b0;c0;d0;for(i1;in;ii1){scanf(%lld,a[i]);b__gcd(b,a[i]);}for(i1;in;ii1)a[i]a[i]/b;for(i1;in;ii1)cca[i];for(i1;;ii*2){if(ic){d1;break;}if(ic)break;}if(d1){printf(NO\n);continue;}else{printf(YES\n);m0;while(1){b0;c0;d0;for(i1;in;ii1){if(a[i]%21){cc1;if(c2){mm1;c0;if(a[i]a[d]){l[m]i;r[m]d;a[i]a[i]-a[d];a[d]a[d]*2;}else{l[m]d;r[m]i;a[d]a[d]-a[i];a[i]a[i]*2;}}elsedi;}}if(c1)break;for(i1;in;ii1)b__gcd(b,a[i]);for(i1;in;ii1)a[i]a[i]/b;}printf(%lld\n,m);for(i1;im;ii1)printf(%lld %lld\n,l[i],r[i]);}}return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容