洛谷-算法1-1-模拟与高精度4

张开发
2026/4/4 21:18:08 15 分钟阅读
洛谷-算法1-1-模拟与高精度4
P1786 帮贡排序题目背景帮派名号星月家园帮主尊号Dragonfly Kang帮派 ID2685023帮派等级4帮派人数101/110帮派技能“星月家园”资料欢迎各位豆友加入 ^_^在 absi2011 的帮派里死号偏多。现在 absi2011 和帮主等人联合决定要清除一些死号加进一些新号同时还要鼓励帮贡多的人对帮派进行一番休整。题目描述目前帮派内共最多有1 位帮主BangZhu2 位副帮主FuBangZhu2 位护法HuFa4 位长老ZhangLao7 位堂主TangZhu25 名精英JingYing若干数量不限帮众BangZhong保证以上职位是从高到低排列的。现在 absi2011 要对帮派内几乎所有人的职位全部调整一番。他发现这是个很难的事情。于是要求你帮他调整。他给你每个人的以下数据名字原来职位帮贡等级他要按照以下关键字给帮派内的人帮主、副帮主除外按以下关键字排序帮贡从高到低第一关键字在输入中出现的顺序从前到后第二关键字然后更新这些人的职位第 1∼2 名护法第 3∼6 名长老第 7∼13 名堂主第 14∼38 名精英第 39∼(n−3) 名帮众可是乐斗的显示并不按帮贡排序而按职位和等级排序。他要你按照以下关键字排序并求出最后乐斗显示的列表在他调整过职位后职位从高到低第一关键字等级从高到低第二关键字在输入中出现的顺序从前到后第三关键字注意absi2011 无权调整帮主、副帮主的职位包括他自己的。输入格式第一行一个正整数 n表示星月家园内帮友的人数。下面 n 行每行两个字符串两个整数表示每个人的名字、职位、帮贡、等级。输出格式一共输出 n 行每行包括排序后乐斗显示的名字、职位、等级。输入输出样例输入 #1复制9 DrangonflyKang BangZhu 100000 66 RenZaiJiangHu FuBangZhu 80000 60 absi2011 FuBangZhu 90000 60 BingQiLingDeYanLei HuFa 89000 58 Lcey HuFa 30000 49 BangYou3 ZhangLao 1000 1 BangYou1 TangZhu 100 40 BangYou2 JingYing 40000 10 BangYou4 BangZhong 400 1输出 #1复制DrangonflyKang BangZhu 66 RenZaiJiangHu FuBangZhu 60 absi2011 FuBangZhu 60 BingQiLingDeYanLei HuFa 58 BangYou2 HuFa 10 Lcey ZhangLao 49 BangYou1 ZhangLao 40 BangYou3 ZhangLao 1 BangYou4 ZhangLao 1说明/提示对于 10% 的数据保证 n3。对于 40% 的数据保证各个人的帮贡均为 0。对于 100% 的数据保证3≤n≤1101≤ 名字长度 ≤30所有名字两两不同名字只包含 ASCII 可见字符0≤ 各个人的帮贡 ≤1091≤ 各个人等级 ≤150职位必定为以下七个中的一个BangZhuFuBangZhuHuFaZhangLaoTangZhuJingYingBangZhong初始时帮派内最多有1 位帮主2 位副帮主2 位护法4 位长老7 位堂主25 名精英恰好有一名帮主恰好有两名副帮主恰好有一名副帮主叫 absi2011【题目来源】fight.pet.qq.comabsi2011 授权题目实现代码#includebits/stdc.h using namespace std; int n; struct node{ string na,zw,xzw; long long bg; int le,h; }ab[115]; int change(string a){ if (aBangZhu) return 0; if (aFuBangZhu) return 1; if (aHuFa) return 2; if (aZhangLao) return 3; if (aTangZhu) return 4; if (aJingYing) return 5; if (aBangZhong) return 6; } int cmp1(node x,node y){ if (x.bgy.bg) return x.hy.h; else return x.bgy.bg; } int cmp2(node x,node y){ if (change(x.xzw)change(y.xzw)){ if (x.ley.le) return x.hy.h; return x.ley.le; } return change(x.xzw)change(y.xzw); } int main(){ cinn; for (int i1;in;i){ cinab[i].naab[i].zwab[i].bgab[i].le; ab[i].hi; } sort(ab4,ab1n,cmp1); for (int i1;in;i){ if (i1) ab[i].xzwBangZhu; else if (i2||i3) ab[i].xzwFuBangZhu; else if (i4||i5) ab[i].xzwHuFa; else if (i6i9) ab[i].xzwZhangLao; else if (i10i16) ab[i].xzwTangZhu; else if (i17i41) ab[i].xzwJingYing; else ab[i].xzwBangZhong; } sort(ab1,ab1n,cmp2); for (int i1;in;i){ coutab[i].na ab[i].xzw ab[i].leendl; } return 0; }P1591 阶乘数码题目描述求 n! 中某个数码出现的次数。输入格式第一行为 t(t≤10)表示数据组数。接下来 t 行每行一个正整数 n(n≤1000) 和数码 a。输出格式对于每组数据输出一个整数表示 n! 中 a 出现的次数。输入输出样例输入 #1复制2 5 2 7 0输出 #1复制1 2实现代码#includebits/stdc.h using namespace std; long long t,a[10009]; int main(){ cint; for(int i1;it;i) { long long n,k,ws1,ans0; cinnk; a[1]1; for(int j2;j10000;j)a[j]0; for(int j2;jn;j) { for(int l1;lws;l) { a[l]*j; } for(int l1;;l) { a[l1]a[l]/10; a[l]%10; if(lwsa[l1]0){wsl;break;} } } for(int j1;jws;j) { if(a[j]k)ans; } coutansendl; } }P1249 最大乘积题目描述一个正整数一般可以分为几个互不相同的自然数的和如 3124135142361524。现在你的任务是将指定的正整数 n 分解成若干个互不相同的自然数也可以不分解就是这个数字本身的和且使这些自然数的乘积最大。输入格式只有一个正整数 n3≤n≤10000。输出格式第一行是分解方案相邻的数之间用一个空格分开并且按由小到大的顺序。第二行是最大的乘积。输入输出样例输入 #1复制10输出 #1复制2 3 5 30实现代码#includeiostream using namespace std; int a[10001]{}; int s[10001]{}; int n,len1; void mul(int x) { for(int i1;ilen;i)s[i]*x; for(int i1;ilen;i) { s[i1]s[i]/10; s[i]%10; } while(s[len1]0) { len; s[len1]s[len]/10; s[len]%10; } } int main() { cinn; if(n3) { cout3endl; cout3endl; return 0; } if(n4) { cout4endl; cout4endl; return 0; } s[0]s[1]1; int Sum0,tot0; for(int i2;Sumn;Sumi,i)a[tot]i; if(Sumn1)a[Sum-n-1]0; else if(Sumn1)a[tot],a[1]0; for(int i1;itot;i) { if(a[i]) { couta[i] ; mul(a[i]); } } coutendl; for(int ilen;i1;i--) couts[i]; coutendl; return 0; }P1045 [NOIP 2003 普及组] 麦森数题目描述形如 2P−1 的素数称为麦森数这时 P 一定也是个素数。但反过来不一定即如果 P 是个素数2P−1 不一定也是素数。到 1998 年底人们已找到了 37 个麦森数。最大的一个是 P3021377它有 909526 位。麦森数有许多重要应用它与完全数密切相关。任务输入 P(1000P3100000)计算 2P−1 的位数和最后 500 位数字用十进制高精度数表示输入格式文件中只包含一个整数 P(1000P3100000)输出格式第一行十进制高精度数 2P−1 的位数。第 2∼11 行十进制高精度数 2P−1 的最后 500 位数字。每行输出 50 位共输出 10 行不足 500 位时高位补 0不必验证 2P−1 与 P 是否为素数。输入输出样例输入 #1复制1279输出 #1复制386 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000104079321946643990819252403273640855 38615262247266704805319112350403608059673360298012 23944173232418484242161395428100779138356624832346 49081399066056773207629241295093892203457731833496 61583550472959420547689811211693677147548478866962 50138443826029173234888531116082853841658502825560 46662248318909188018470682222031405210266984354887 32958028878050869736186900714720710555703168729087说明/提示【题目来源】NOIP 2003 普及组第四题实现代码#includebits/stdc.h int n,a[1010],res[1010],cnt; void multiply1(){ int tmp[1010]{0}; for(int i0;i500;i){ for(int j0;j500;j) tmp[ij]res[i]*a[j]; } int t0; for(int i0;i500;i){ tmp[i]t; res[i]tmp[i]%10; ttmp[i]/10; } } void multiply2(){ int tmp[1010]{0}; for(int i0;i500;i){ for(int j0;j500;j) tmp[ij]a[i]*a[j]; } int t0; for(int i0;i500;i){ tmp[i]t; a[i]tmp[i]%10; ttmp[i]/10; } } void quick_pow(int p){ res[0]1,a[0]2; while(p){ if(p1) multiply1(); multiply2(); p1; } } int main(){ scanf(%d,n); int lengthn*log10(2)1; printf(%d\n,length); quick_pow(n); res[0]-1; for(int i499;i0;i--){ if(cnt50) printf(\n),cnt0; printf(%d,res[i]); cnt; } return 0; }

更多文章