
算法练习
ACM
GenoQin
这个作者很懒,什么都没留下…
展开
-
约瑟夫环
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。输入样例3 2输出样例3思路:f[1]=0f[i]=(f[i-1] + m) % i (i>1)#include <stdio.h>using namespace std;const int maxn=1e6+7;int f[maxn];int main(){ int n,k; scanf("%d%d",&n,原创 2021-04-20 10:47:14 · 165 阅读 · 0 评论 -
博弈论(威佐夫游戏)
有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。输入样例33 53 41 9输出样例BAA思路:威佐夫博弈:有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情原创 2021-04-19 17:34:04 · 784 阅读 · 0 评论 -
博弈论(Nim游戏)
有N堆石子。A B两个人轮流拿,A先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N及每堆石子的数量,问最后谁能赢得比赛。例如:3堆石子,每堆1颗。A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子。输入样例3111输出样例A这是不是很复杂,首先我们考虑数据小的情况:1.只有一堆石子时,除非没有石子,否则先手一把抓完即可;2.有两堆石子时,后手只需要跟随先手的动作即可 ,但是相等的原创 2021-04-18 09:35:36 · 444 阅读 · 0 评论 -
博弈论(Bush Game)
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。思路:拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。#include<iostream>using namespace s原创 2021-04-09 09:42:50 · 230 阅读 · 0 评论 -
N的阶乘的长度
输入N求N的阶乘的10进制表示的长度。输入样例6输出样例3#include <iostream>#include <cmath>using namespace std;int main() { double n,i,res=0; int ans; cin >> n; for(i=1;i<=n;i++) { res += log10(i); } ans = res+1; cou原创 2021-04-06 09:29:16 · 104 阅读 · 0 评论 -
A^B Mod C
给出3个正整数A B C,求A^B Mod C。输入样例3 5 8输出样例3#include<iostream>using namespace std;int poww(long long a,long long b,long long c){ long long ans=1,base=a; while(b!=0){ if(b&1!=0){ ans*=base; ans=ans%c; } ba原创 2021-04-05 10:05:34 · 174 阅读 · 0 评论 -
大数乘法
给出2个大整数A,B,计算A*B的结果。输入第1行:大数A第2行:大数B(A,B的长度 <= 1000,A,B >= 0)输出输出A * B思路:用第一个数组依次乘第二个数组中的每一位数,记录,然后输出(本题需要注意边界)#include<iostream>using namespace std;char num1[1010],num2[1010],num[10000010];int maxm;int length(string num){ int l原创 2021-04-03 13:15:41 · 101 阅读 · 0 评论 -
排序
给出N个整数,对这N个整数进行排序输入样例554321输出样例12345简单的写了两种排序算法,冒泡排序和堆排序(时间复杂度:o(n^2),o(n*ln(n))#include<iostream>using namespace std;int num[50005],n,temp;//交换 void swap(int *a,int *b){ int p; p=*a; *a=*b; *b=p;} //冒泡排序 void bubble(int n原创 2021-04-02 12:03:42 · 92 阅读 · 0 评论 -
最长公共子序列
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。比如两个串为:abcicbaabdkscabab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。输入样例abcicbaabdkscab输出样例abca思路:#include<iostream>using namespace std;int dp[1010][1010],c[1010][1010];void LCS(string s1,string s2)原创 2021-04-01 16:49:50 · 133 阅读 · 0 评论 -
八皇后问题
在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。#include <stdio.h> int ans[92][8], n, b, i, j, num, hang[8]; void queen(int i){ int j, k; if(i == 8){ //一组新的解产生了 for(j = 0; j < 8; j++) ans[num][j] = hang[j] +原创 2021-03-31 22:53:58 · 148 阅读 · 0 评论 -
任务调度器
给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。然而,两个相同种类的任务之间必须有长度为 n 的冷却时间。具体看样例解释。你需要计算完成所有任务所需要的最短时间。解题思路:输入: 6 AAABBB 2输出: 8分析: A -> B -> (待命) -> A -> B原创 2021-03-31 22:45:48 · 204 阅读 · 1 评论