├── 7.2队列的应用 └── 同6.5队列的应用.txt ├── 7.1栈的应用 └── 同6.7stack用法详解.txt ├── 4.5二分 ├── 1936.c ├── 1934.c └── 1937.cpp ├── README.md ├── 2.2顺序结构 ├── 24505.c ├── 24507.c ├── 24506.c ├── 24508.c ├── 25269.c └── 25268.c ├── 2.10黑盒测试 ├── 1000.cpp ├── 1006.cpp ├── 1002.cpp ├── 1001.cpp ├── 1005.cpp ├── 1004.cpp ├── 1007.cpp └── 1003.cpp ├── 2.4循环结构 ├── 25588.c ├── 25586.c ├── 25587.c ├── 25590.c ├── 25589.c ├── 25592.c ├── 25594.c ├── 25609.c └── 25593.c ├── 2.7指针 ├── 1278.cpp ├── 1269.cpp ├── 1270.cpp ├── 1283.cpp └── 1284.cpp ├── 2.3选择结构 ├── 25333.c ├── 25345.c ├── 25334.c ├── 25332.c └── 25354.c ├── 2.5数组 ├── 26040.c ├── 26049.c ├── 26050.c ├── 26045.c ├── 26052.c ├── 26044.c ├── 26039.c ├── 26051.c ├── 26055.c └── 26041.c ├── 3.6字符串处理 ├── 1967.c ├── 1963.c ├── 5901.c ├── 1805.c ├── 1785.c ├── 2064.c ├── 1962.c ├── 2025.c ├── 1962(2).c └── 1808.cpp ├── 4.3递归 ├── 1907.c ├── 2044.c ├── 2018.c └── 2046.cpp ├── 6.9algorithm头文件详解 ├── 1967.cpp ├── 1959.cpp └── 1801.c ├── 5.8组合数 ├── 4826.cpp └── 5849.cpp ├── 5.1简单数学 ├── 2039.cpp ├── 1940.cpp ├── 2001.cpp ├── 1958.cpp ├── 1957.cpp ├── 2000.cpp ├── 1996.cpp ├── 2024.cpp ├── 2068.cpp ├── 2048.cpp ├── 1968.cpp ├── 1970.cpp └── 1939.cpp ├── 3.1简单模拟 ├── 6128.cpp ├── 1906.cpp ├── 2036.cpp ├── 6170.cpp ├── 1817.cpp ├── 6116.cpp ├── 1814.cpp ├── 6129.cpp ├── 6172.cpp └── 6172(2).cpp ├── 4.1排序 ├── 1923.cpp ├── 1927.cpp ├── 1925.cpp ├── 2069.cpp ├── 2043.cpp ├── 2080.cpp ├── 1926.cpp ├── 2088.cpp └── 1978.cpp ├── 5.3分数的四则运算 └── 1067.cpp ├── 3.3图形输出 ├── 1933.cpp ├── 2003.cpp ├── 1993.cpp └── 2506.cpp ├── 11.8 动态规划总结 ├── 2072.cpp ├── 2075.cpp ├── 1961.cpp ├── 1911.cpp ├── 2097.cpp ├── 2058.cpp ├── 2090.cpp ├── 1799.cpp └── 1916.cpp ├── 2.8结构体 ├── 1304.cpp ├── 1303.cpp ├── 1309.cpp ├── 1310.cpp └── 1306.cpp ├── 3.5进制转换 ├── 1944.cpp ├── 1941.cpp ├── 1941(2).cpp ├── 1942(2).cpp ├── 1943.cpp └── 1942.cpp ├── 5.7扩展欧几里德算法 └── 5124.cpp ├── 4.2哈希 ├── 6120.cpp ├── 1782.cpp ├── 6112.cpp └── 2066.cpp ├── 9.3树的遍历 ├── 2450.cpp └── 1914.cpp ├── 8.1深度优先搜索DFS ├── 5977.cpp ├── 5972.cpp ├── 5974.cpp ├── 5973.cpp ├── 5976.cpp └── 5978.cpp ├── 3.2查找元素 ├── 1932.cpp ├── 1934.cpp ├── 1937.cpp ├── 2020.cpp └── 1935.cpp ├── 2.6函数 ├── 26339.cpp └── 26340.cpp ├── 5.2最大公约数和最小公倍数 └── 2136.cpp ├── 11.1动态规划专题-动态规划的递归写法和递推写法 └── 1795.cpp ├── 3.4日期处理 ├── 1931.cpp ├── 2026.cpp ├── 2063.cpp └── 1928.cpp ├── 5.4素数 ├── 2125.cpp ├── 1946.cpp └── 1945.cpp ├── 11.7 背包问题 ├── 21869.cpp ├── 24338.cpp └── 24339.cpp ├── 9.2二叉树的遍历 ├── 1905.cpp ├── 2014.cpp ├── 1096.cpp └── 1910.cpp ├── 5.5质因子分解 ├── 1948.cpp ├── 1997.cpp ├── 1783.cpp └── 1947.cpp ├── 12.2KMP算法 ├── 3708.cpp ├── 2987.cpp └── 2790.cpp ├── 6.8pair用法详解 └── 1114.cpp ├── 11.3动态规划最长不下降子序列 └── 21280.cpp ├── 4.4贪心 ├── 2143.cpp ├── 2132.cpp ├── 1128.cpp ├── 5038.cpp ├── 2134.cpp └── 1126.cpp ├── 11.4最长公共子序列 └── 1132.cpp ├── 6.5queue用法详解 └── 1863.cpp ├── 12.1字符串hash进阶 └── 2432.cpp ├── 11.2动态规划-最大连续子序列和 └── 2086.cpp ├── 9.7堆 ├── 26025.cpp └── 1779.cpp ├── 9.8哈夫曼树 ├── 1921.cpp └── 5068.cpp ├── 4.6two pointers ├── 2932.cpp ├── 2843.cpp └── 3105.cpp ├── 4.7其他技巧与算法 └── 5067.cpp ├── 6.1vector常见用法详解 ├── 6114.cpp └── 6117.cpp ├── 10.3图的遍历 ├── 1798.cpp └── 1908.cpp ├── 5.6大整数运算 ├── 1949.cpp ├── 1917.cpp ├── 1951.cpp ├── 1950.cpp ├── 1952.cpp └── 1922.cpp ├── 7.3链表 ├── 2421.cpp ├── 1870.cpp ├── 3596.cpp ├── 3597.cpp └── 2453.cpp ├── 10.4最短路径 ├── 1769.cpp ├── 1768.cpp ├── 1956.cpp └── 1988.cpp ├── 11.5最长回文子串 └── 22562.cpp ├── 11.6DAG最长路 └── 21773.cpp ├── 13.2树状数组 ├── 1098.cpp ├── 5347.cpp ├── 2497.cpp └── 1110.cpp ├── 9.6并查集 ├── 1953.cpp ├── 2128.cpp ├── 2130.cpp └── 1106.cpp ├── 6.4map用法详解 └── 6168.cpp ├── 10.5最小生成树 ├── 1813.cpp ├── 1972.cpp ├── 1954.cpp └── 1913.cpp ├── 10.6拓扑排序 ├── 2138.cpp ├── 2117.cpp └── 1767.cpp ├── 6.2set常见用法详解 └── 6126.cpp ├── 6.6priority_queue用法详解 └── 1985.cpp ├── 8.2广度优先搜索BFS └── 4054.cpp ├── 13.1分块思想 └── 1110.cpp └── 6.7stack常见用法 └── 1982.cpp /7.2队列的应用/同6.5队列的应用.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /7.1栈的应用/同6.7stack用法详解.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /4.5二分/1936.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maximusyoung007/codeup/HEAD/4.5二分/1936.c -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # codeup 2 | 《算法笔记》(胡凡,曾磊主编)作业 3 | 4 | 本人菜鸡,参考了很多别人的答案,均在文件头标明了出处 5 | 6 | 如有问题请联系本人1091261998@qq.com指正。不胜感激。 7 | -------------------------------------------------------------------------------- /2.2顺序结构/24505.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | printf("This is my first c program!"); 5 | return 0; 6 | } 7 | -------------------------------------------------------------------------------- /2.2顺序结构/24507.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a = 123,b = 456; 5 | int sum = a + b; 6 | printf("sum=%d",sum); 7 | } 8 | -------------------------------------------------------------------------------- /2.2顺序结构/24506.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | printf("********************\nVery Good!\n********************"); 5 | return 0; 6 | } 7 | -------------------------------------------------------------------------------- /2.2顺序结构/24508.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a,b; 5 | scanf("%d %d",&a,&b); 6 | printf("%d",a + b); 7 | return 0; 8 | } 9 | -------------------------------------------------------------------------------- /2.2顺序结构/25269.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | char a[5]; 5 | scanf("%s",a); 6 | printf("%s",a); 7 | printf("\n"); 8 | return 0; 9 | } 10 | -------------------------------------------------------------------------------- /2.10黑盒测试/1000.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a,b; 5 | while(scanf("%d %d",&a,&b) != EOF){ 6 | printf("%d\n",a + b); 7 | } 8 | return 0; 9 | } 10 | -------------------------------------------------------------------------------- /2.4循环结构/25588.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int i,sum = 0; 5 | for(i = 1;i <= 100;i++){ 6 | sum += i; 7 | } 8 | printf("%d\n",sum); 9 | return 0; 10 | } 11 | -------------------------------------------------------------------------------- /2.4循环结构/25586.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int i = 1,sum = 0; 5 | while(i <= 100){ 6 | sum += i; 7 | i++; 8 | } 9 | printf("%d\n",sum); 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /2.10黑盒测试/1006.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a,b; 5 | while(scanf("%d %d",&a,&b) != EOF){ 6 | printf("%d\n",a + b); 7 | printf("\n"); 8 | } 9 | return 0; 10 | } 11 | -------------------------------------------------------------------------------- /2.4循环结构/25587.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int i = 1,sum = 0; 5 | do{ 6 | sum += i; 7 | i++; 8 | }while(i <= 100); 9 | printf("%d\n",sum); 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /2.4循环结构/25590.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int i = 1,sum = 0; 5 | while(sum <= 1000){ 6 | sum += i; 7 | i++; 8 | } 9 | printf("%d\n",i - 1); 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /2.10黑盒测试/1002.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a,b; 5 | while(scanf("%d %d",&a,&b) != EOF){ 6 | if(a == 0 && b == 0)break; 7 | else printf("%d\n",a + b); 8 | } 9 | return 0; 10 | } 11 | -------------------------------------------------------------------------------- /2.10黑盒测试/1001.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int n,i,a,b; 5 | scanf("%d",&n); 6 | for(i = 0;i < n;i++){ 7 | scanf("%d %d",&a,&b); 8 | printf("%d\n",a + b); 9 | } 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /2.7指针/1278.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | char *a = "I love China!"; 7 | int n; 8 | cin >> n; 9 | a = a + n; 10 | puts(a); 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /2.3选择结构/25333.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | float a,b; 5 | scanf("%f%f",&a,&b); 6 | if(a >= b){ 7 | printf("%.2f %.2f\n",b,a); 8 | } 9 | else printf(".2f .2f\n",a,b); 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /2.4循环结构/25589.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int sum = 0,n; 5 | scanf("%d",&n); 6 | for(int i = 1; i <= n; i++) 7 | { 8 | sum += i; 9 | } 10 | printf("%d\n",sum); 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /2.4循环结构/25592.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | for(int i = 1;i <= 4;i++){ 5 | for(int j = 1;j <= 5;j++){ 6 | printf("%3d",i * j); 7 | if(j == 5)printf("\n"); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /2.5数组/26040.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a[11]; 5 | for(int i = 0;i < 10;i++){ 6 | scanf("%d",&a[i]); 7 | } 8 | for(int i = 9;i >= 0;i--){ 9 | printf("%d\n",a[i]); 10 | } 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /2.5数组/26049.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a[11]; 5 | for(int i = 0;i < 10;i++){ 6 | scanf("%d",&a[i]); 7 | } 8 | for(int i = 9;i >= 0;i--){ 9 | printf("%d\n",a[i]); 10 | } 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /2.4循环结构/25594.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int f1 = 1,f2 = 1; 5 | int n,f; 6 | scanf("%d",&n); 7 | for(int i = 3;i <= n;i++){ 8 | f = f1 + f2; 9 | f1 = f2; 10 | f2 = f; 11 | } 12 | printf("%d\n",f); 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /2.4循环结构/25609.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | double f1 = 2,f2 = 1,sum = 0,f; 5 | for(int i = 1;i <= 20;i++){ 6 | f = f1 + f2; 7 | sum += f1/f2; 8 | f2 = f1; 9 | f1 = f; 10 | } 11 | printf("%.6f\n",sum); 12 | return 0; 13 | } 14 | -------------------------------------------------------------------------------- /2.5数组/26050.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int f1 = 1,f2 = 1; 5 | int f; 6 | printf("%d\n%d\n",f1,f2); 7 | for(int i = 3;i <= 20;i++){ 8 | f = f1 + f2; 9 | printf("%d\n",f); 10 | f1 = f2; 11 | f2 = f; 12 | } 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /3.6字符串处理/1967.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char s[250]; 6 | while(gets(s)){ 7 | int len = strlen(s); 8 | for(int i = len - 1;i >= 0;i--){ 9 | printf("%c",s[i]); 10 | } 11 | printf("\n"); 12 | } 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /2.10黑盒测试/1005.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int n,m; 5 | while(scanf("%d",&n) != EOF){ 6 | int sum = 0; 7 | for(int i = 0;i < n;i++){ 8 | scanf("%d",&m); 9 | sum += m; 10 | } 11 | printf("%d\n",sum); 12 | } 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /2.7指针/1269.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int a,b; 6 | int *c = &a,*d = &b; 7 | cin >> a >> b; 8 | if(*c > *d){ 9 | cout << *c << ' ' << *d << '\n'; 10 | } 11 | else{ 12 | cout << *d << ' ' << *c << '\n'; 13 | } 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /2.2顺序结构/25268.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main() 5 | { 6 | double a,b,c,t,r1,r2; 7 | scanf("%lf %lf %lf",&a,&b,&c); 8 | t = b * b - 4 * a * c; 9 | t = sqrt(t); 10 | r1 = (-b + t)/(2 * a); 11 | r2 = (-b - t)/(2 * a); 12 | printf("r1=%7.2f\n",r1); 13 | printf("r2=%7.2f\n",r2); 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /3.6字符串处理/1963.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | char str[11000],c; 5 | while(gets(str)){ 6 | scanf("%c",&c); 7 | for(int i = 0;str[i] != '\0';i++) 8 | if(str[i] != c) 9 | printf("%c",str[i]); 10 | printf("\n"); 11 | getchar();//清除缓冲区 12 | } 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /4.3递归/1907.c: -------------------------------------------------------------------------------- 1 | #include 2 | int fn(int n) 3 | { 4 | if(n == 1) 5 | return 1; 6 | else if(n == 2) 7 | return 2; 8 | else 9 | return fn(n-1) + fn(n-2); 10 | } 11 | int main() 12 | { 13 | int n; 14 | while(scanf("%d",&n) != EOF){ 15 | printf("%d\n",fn(n)); 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /2.3选择结构/25345.c: -------------------------------------------------------------------------------- 1 | #include 2 | void swap(int *a,int *b) 3 | { 4 | int t; 5 | t = *a; 6 | *a = *b; 7 | *b = t; 8 | } 9 | int main() 10 | { 11 | int a,b,c,t; 12 | scanf("%d %d %d",&a,&b,&c); 13 | if(a>b)swap(&a,&b); 14 | if(a>c)swap(&a,&c); 15 | if(b>c)swap(&b,&c); 16 | printf("%d\n",c); 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /6.9algorithm头文件详解/1967.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | string s; 7 | while(getline(cin,s)){ 8 | int len = s.length(); 9 | for(int i = len - 1;i >= 0;i--){ 10 | cout << s[i]; 11 | } 12 | cout << endl; 13 | } 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /5.8组合数/4826.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | float fact(int n) 4 | { 5 | float result = 1; 6 | for(int i = 2;i <= n;i++){ 7 | result = result * i; 8 | } 9 | return result; 10 | } 11 | int main() 12 | { 13 | int m,n; 14 | while(cin >> m >> n){ 15 | cout << fact(m) / fact(n) / fact(m - n) << endl; 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /5.8组合数/5849.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | float fact(int n) 4 | { 5 | float result = 1; 6 | for(int i = 2;i <= n;i++){ 7 | result = result * i; 8 | } 9 | return result; 10 | } 11 | int main() 12 | { 13 | int m,n; 14 | while(cin >> m >> n){ 15 | cout << fact(m) / fact(n) / fact(m - n) << endl; 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /2.10黑盒测试/1004.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int m,n,k; 5 | scanf("%d",&n); 6 | for(int i = 0;i < n;i++){ 7 | scanf("%d",&m); 8 | int sum = 0; 9 | for(int j = 0;j < m;j++){ 10 | scanf("%d",&k); 11 | sum += k; 12 | } 13 | printf("%d\n",sum); 14 | } 15 | return 0; 16 | } 17 | -------------------------------------------------------------------------------- /3.6字符串处理/5901.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main(){ 4 | char str[260]; 5 | scanf("%s",str); 6 | int len = strlen(str); 7 | int i,tag = 1; 8 | for(i = 0;i < len / 2;i++) 9 | if(str[i] != str[len - i - 1]){ 10 | tag = 0; 11 | break; 12 | } 13 | if(tag) 14 | printf("YES\n"); 15 | else 16 | printf("NO\n"); 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /2.5数组/26045.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main () 3 | { 4 | int i = 0; 5 | char str1[100]; 6 | char str2[100]; 7 | gets(str1); 8 | gets(str2); 9 | while((str1[i] == str2[i]) && (str1[i] != '\0')){ 10 | i++; 11 | } 12 | if((str1[i] == '\0') && (str2[i]== '\0')){ 13 | printf("0\n"); 14 | } 15 | else{ 16 | printf("%d\n",str1[i] - str2[i]); 17 | } 18 | return 0; 19 | } 20 | -------------------------------------------------------------------------------- /2.5数组/26052.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a[10][10]; 5 | int i,j; 6 | 7 | for(i = 0;i < 2;i++){ 8 | for(j = 0;j < 3;j++) 9 | scanf("%d",&a[i][j]); 10 | } 11 | 12 | for(i = 0;i < 3;i++){ 13 | for(j = 0;j < 2;j++) 14 | printf("%d ",a[j][i]); 15 | printf("\n"); 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /5.1简单数学/2039.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | const int maxn=1005; 3 | double y[maxn]; 4 | int main(){ 5 | double x; 6 | int n; 7 | while(scanf("%lf%d",&x,&n) != EOF){ 8 | y[0] = x; 9 | for(int i = 0;i < n;i++) { 10 | y[i+1] = y[i] * 2 / 3 + x / (3 * y[i] * y[i]); 11 | } 12 | printf("%.6f\n",y[n]); 13 | } 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /2.3选择结构/25334.c: -------------------------------------------------------------------------------- 1 | #include 2 | void swap(double *a,double *b) 3 | { 4 | double t; 5 | t = *a; 6 | *a = *b; 7 | *b = t; 8 | } 9 | int main() 10 | { 11 | double a,b,c,t; 12 | scanf("%lf %lf %lf",&a,&b,&c); 13 | if(a>b)swap(&a,&b); 14 | if(a>c)swap(&a,&c); 15 | if(b>c)swap(&b,&c); 16 | printf("%0.2f %0.2lf %0.2lf\n",a,b,c); 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /2.4循环结构/25593.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | int sign = 1; 6 | double PI = 0.0,n = 1.0,term = 1.0; 7 | while(fabs(term) >= 1e-6) 8 | { 9 | PI = PI + term; 10 | n = n + 2; 11 | sign =- sign; 12 | term = sign / n; 13 | } 14 | PI = PI * 4; 15 | printf("PI=%10.8f\n",PI); 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /2.10黑盒测试/1007.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int m,n,k; 5 | scanf("%d",&n); 6 | for(int i = 0;i < n;i++){ 7 | scanf("%d",&m); 8 | int sum = 0; 9 | for(int j = 0;j < m;j++){ 10 | scanf("%d",&k); 11 | sum += k; 12 | } 13 | printf("%d\n",sum); 14 | printf("\n"); 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /2.10黑盒测试/1003.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int n,m; 5 | while(scanf("%d",&n) != EOF){ 6 | if(n == 0)break; 7 | else{ 8 | int sum = 0; 9 | for(int i = 0;i < n;i++){ 10 | scanf("%d",&m); 11 | sum += m; 12 | } 13 | printf("%d\n",sum); 14 | } 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /3.1简单模拟/6128.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | long a,b,c; 7 | int n; 8 | scanf("%d",&n); 9 | for(int i = 0;i < n;i++){ 10 | cin >> a >> b >> c; 11 | if(a + b > c) 12 | printf("Case #%d: true\n",i + 1); 13 | else 14 | printf("Case #%d: false\n",i + 1); 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /4.1排序/1923.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | int n,a[110]; 7 | while(scanf("%d",&n) != EOF){ 8 | for(int i = 0;i < n;i++){ 9 | scanf("%d",&a[i]); 10 | } 11 | sort(a,a + n); 12 | for(int i = 0;i < n;i++){ 13 | printf("%d ",a[i]); 14 | } 15 | printf("\n"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /2.3选择结构/25332.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main() 5 | { 6 | double a,b,c,t,r1,r2; 7 | scanf("%lf %lf %lf",&a,&b,&c); 8 | t = b * b - 4 * a * c; 9 | if(t >= 0){ 10 | t = sqrt(t); 11 | r1 = (-b + t)/(2 * a); 12 | r2 = (-b - t)/(2 * a); 13 | printf("r1=%7.2f\n",r1); 14 | printf("r2=%7.2f\n",r2); 15 | } 16 | else printf("No real roots!\n"); 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /5.3分数的四则运算/1067.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | int n; 7 | while(cin >> n && n != 0){ 8 | double j = n - 1; 9 | double result = 0; 10 | for(double i = 2;i <= n;i++){ 11 | result += 1 / i * 2 * j; 12 | j--; 13 | } 14 | result += n; 15 | printf("%.2f\n",result); 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /2.7指针/1270.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | void swap(int *a,int *b) 4 | { 5 | int temp = *a; 6 | *a = *b; 7 | *b = temp; 8 | } 9 | int main() 10 | { 11 | int a,b,c; 12 | int *d = &a,*e = &b,*f = &c; 13 | cin >> a >> b >> c; 14 | if(*d < *e)swap(*d,*e); 15 | if(*e < *f)swap(*e,*f); 16 | if(*d < *e)swap(*d,*e); 17 | cout << *d << ' ' << *e << ' ' << *f << '\n'; 18 | return 0; 19 | } 20 | -------------------------------------------------------------------------------- /3.3图形输出/1933.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int h; 6 | while(scanf("%d",&h) != EOF){ 7 | for(int i = 1;i <= h;i++){ 8 | for(int j = 0;j < (h - i) * 2;j++){ 9 | printf(" "); 10 | } 11 | for(int k = (h - i) * 2;k < h + 2 * (h - 1);k++){ 12 | printf("*"); 13 | } 14 | printf("\n"); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /3.3图形输出/2003.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main(){ 3 | int h,n; 4 | scanf("%d",&n); 5 | while(n--){ 6 | scanf("%d",&h); 7 | for(int i = 1;i <= h;i++){ 8 | int j; 9 | for(j = 0;j < h - i;j++){ 10 | printf(" "); 11 | } 12 | for(j = 0;j < h + (i - 1) * 2;j++){ 13 | printf("*"); 14 | } 15 | for(j = 0;j < h - i;j++){ 16 | printf(" "); 17 | } 18 | printf("\n"); 19 | } 20 | } 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /11.8 动态规划总结/2072.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int f(int m,int n) 4 | { 5 | if(m == 0 || n == 1) 6 | return 1; 7 | if(n > m) 8 | return f(m,m); 9 | else if(n <= m) 10 | return f(m,n - 1) + f(m - n,n); 11 | } 12 | int main() 13 | { 14 | int t,m,n; 15 | cin >> t; 16 | for(int i = 0;i < t;i++) 17 | { 18 | cin >> m >> n; 19 | cout << f(m,n) << endl; 20 | } 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /6.9algorithm头文件详解/1959.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | int main() 7 | { 8 | char c[10]; 9 | while(gets(c)){ 10 | int len = strlen(c); 11 | do{ 12 | for(int i = 0;i < len;i++){ 13 | cout << c[i]; 14 | } 15 | cout << endl; 16 | }while(next_permutation(c,c + len)); 17 | cout << endl; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /2.8结构体/1304.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | struct student { 3 | int num; 4 | char name[20]; 5 | char sex; 6 | int age; 7 | }stu[1000]; 8 | int main(){ 9 | int n; 10 | scanf("%d",&n); 11 | for(int i = 0; i < n; i++){ 12 | scanf("%d %s %c %d",&stu[i].num,stu[i].name,&stu[i].sex,&stu[i].age); 13 | } 14 | for(int i = 0; i < n; i++){ 15 | printf("%d %s %c %d\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age); 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /3.1简单模拟/1906.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char a[20],b[20]; 6 | while(scanf("%s %s",a,b) != EOF){ 7 | int len1 = strlen(a); 8 | int len2 = strlen(b); 9 | int sum = 0; 10 | for(int i = 0;i < len1;i++){ 11 | for(int j = 0;j < len2;j++){ 12 | sum += (a[i] - '0') * (b[j] - '0'); 13 | } 14 | } 15 | printf("%d\n",sum); 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /3.5进制转换/1944.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int ten_to_eight(int n); 3 | int main() 4 | { 5 | int n; 6 | while(scanf("%d",&n) != EOF){ 7 | int result = ten_to_eight(n); 8 | printf("%d\n",result); 9 | } 10 | } 11 | int ten_to_eight(int n) 12 | { 13 | int temp = 0,result = 0,factor = 1; 14 | while(n){ 15 | int temp = n % 8; 16 | result += temp * factor; 17 | n /= 8; 18 | factor *= 10; 19 | } 20 | return result; 21 | } 22 | -------------------------------------------------------------------------------- /5.1简单数学/1940.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int i,j; 6 | for(i = 1000;i < 1113;i++){ 7 | int result = 0; 8 | int temp = i;//use to save the value of i 9 | for(j = 0;j < 4;j++){ 10 | int index = temp % 10; 11 | result = result * 10 + index; 12 | temp = temp / 10; 13 | } 14 | if(result == i * 9) 15 | cout << i << endl; 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /5.1简单数学/2001.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int i,j; 6 | for(i = 1000;i < 1113;i++){ 7 | int result = 0; 8 | int temp = i;//use to save the value of i 9 | for(j = 0;j < 4;j++){ 10 | int index = temp % 10; 11 | result = result * 10 + index; 12 | temp = temp / 10; 13 | } 14 | if(result == i * 9) 15 | cout << i << endl; 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /5.7扩展欧几里德算法/5124.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | long long a,b,x,y; 5 | int exgcd(long long a,long long b,long long &x,long long &y) 6 | { 7 | if(b == 0) 8 | { 9 | x = 1; 10 | y = 0; 11 | return a; 12 | } 13 | exgcd(b,a%b,x,y); 14 | long long temp = x; 15 | x = y; 16 | y = temp - a / b * y; 17 | } 18 | int main() 19 | { 20 | cin >> a >> b; 21 | long long k = exgcd(a,b,x,y); 22 | printf("%d\n",(x + b) % b); 23 | return 0; 24 | } 25 | -------------------------------------------------------------------------------- /2.5数组/26044.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char str[100]; 6 | gets(str); 7 | int length = strlen(str); 8 | for(int i = 0;i < length;i++){ 9 | if(str[i] >= 'a' && str[i] <= 'z'){ 10 | str[i] = 'z' - (str[i] - 'a'); 11 | } 12 | else if(str[i] >= 'A' && str[i] <= 'Z'){ 13 | str[i] = 'Z' - (str[i] - 'A'); 14 | } 15 | } 16 | puts(str); 17 | return 0; 18 | printf("\n"); 19 | } 20 | -------------------------------------------------------------------------------- /3.5进制转换/1941.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main(){ 4 | int m, a, b; 5 | while(cin>>m){ 6 | if (!m) break; 7 | cin >> a >> b; 8 | unsigned int sum = a + b; 9 | int ans[32],i = 0; 10 | do{ 11 | ans[i++] = sum % m; 12 | sum /= m; 13 | }while(sum != 0); 14 | for(int j = i -1;j >= 0;j--) 15 | cout << ans[j]; 16 | cout << endl; 17 | } 18 | return 0; 19 | } 20 | -------------------------------------------------------------------------------- /4.1排序/1927.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | bool cmp(char a,char b) 7 | { 8 | return a < b; 9 | } 10 | int main() 11 | { 12 | 13 | char a[201]; 14 | //gets可以接受空格 15 | while(gets(a)){ 16 | int len = strlen(a); 17 | sort(a,a+len,cmp); 18 | for(int i = 0;i < len;i++){ 19 | printf("%c",a[i]); 20 | } 21 | cout << endl; 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /4.2哈希/6120.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | char s1[11000],s2[11000]; 8 | gets(s1); 9 | gets(s2); 10 | int i,j; 11 | for(i = 0;i < strlen(s1);i++) 12 | { 13 | for(j = 0;j < strlen(s2);j++) 14 | { 15 | if(s1[i] == s2[j]) 16 | break; 17 | } 18 | if(j == strlen(s2)) 19 | cout << s1[i]; 20 | } 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /3.6字符串处理/1805.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | char str[100]; 4 | int main() { 5 | while(gets(str)) 6 | { 7 | if(str[0] >= 'a' && str[0] <= 'z') 8 | str[0] -= 32; 9 | for(int i = 1;i < strlen(str);i++) 10 | if(str[i] == ' ' || str[i] == '\t' || str[i]=='\r' || str[i] == '\n') 11 | if(str[i + 1] >= 'a' && str[i + 1] <= 'z') 12 | str[i+1] -= 32; 13 | puts(str); 14 | } 15 | return 0; 16 | } 17 | -------------------------------------------------------------------------------- /9.3树的遍历/2450.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | int a[10000],n,father,son,result,k = 1; 7 | scanf("%d",&n); 8 | a[1] = 1; 9 | for(int i = 0;i < n - 1;i++){ 10 | cin >> father >> son; 11 | a[son] = a[father] + 1; 12 | } 13 | 14 | result = 1; 15 | for(int i = 1;i <= n;i++){ 16 | if(a[i] > result) 17 | result = a[i]; 18 | } 19 | printf("%d\n",result); 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /2.5数组/26039.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a[12],i; 5 | for(i = 0;i < 9;i++){ 6 | scanf("%d",&a[i]); 7 | } 8 | scanf("%d",&a[9]); 9 | for(i = 9;i >= 0;i--){ 10 | if(a[i] <= a[i - 1]){ 11 | int t = a[i - 1]; 12 | a[i - 1] = a[i]; 13 | a[i] = t; 14 | } 15 | else if(a[i] > a[i - 1])break; 16 | } 17 | for(int i = 0;i < 10;i++){ 18 | printf("%d\n",a[i]); 19 | } 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /8.1深度优先搜索DFS/5977.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int countn,n; 3 | void find_num(int num,int pop,int push) 4 | { 5 | if(pop == 0 && push == 0){ 6 | countn++; 7 | } 8 | if(push > 0) 9 | find_num(num + 1,pop,push - 1); 10 | if(num > 0 && pop > 0) 11 | find_num(num - 1,pop - 1,push); 12 | } 13 | int main() 14 | { 15 | while(~scanf("%d",&n)){ 16 | countn = 0; 17 | find_num(0,n,n); 18 | printf("%d\n",countn); 19 | } 20 | return 0; 21 | } 22 | 23 | -------------------------------------------------------------------------------- /3.1简单模拟/2036.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int n,a; 5 | while(scanf("%d",&n) != EOF){ 6 | int count_odd = 0,count_even = 0; 7 | for(int i = 0;i < n;i++){ 8 | scanf("%d",&a); 9 | if(a % 2 == 0) 10 | count_even++; 11 | else 12 | count_odd++; 13 | } 14 | if(count_even > count_odd) 15 | printf("NO\n"); 16 | else 17 | printf("YES\n"); 18 | } 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /4.3递归/2044.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int a[30]; 4 | int count(int w,int k) 5 | { 6 | if(w == 0) 7 | return 1; 8 | if(k <= 0) 9 | return 0; 10 | return count(w,k-1) + count(w-a[k],k-1); 11 | } 12 | int main() 13 | { 14 | int n; 15 | while(scanf("%d",&n) != EOF){ 16 | for(int i = 1;i <= n;i++){ 17 | scanf("%d",&a[i]); 18 | } 19 | printf("%d\n",count(40,n)); 20 | memset(a,0,sizeof(a)); 21 | } 22 | return 0; 23 | } 24 | -------------------------------------------------------------------------------- /5.1简单数学/1958.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | for(int a = 0;a <= 9;a++){ 6 | for(int b = 0;b <= 9;b++){ 7 | for(int c = 0;c <= 9;c++){ 8 | int addend1 = a * 100 + b * 10 + c; 9 | int addend2 = b * 100 + c * 10 + c; 10 | if(addend1 + addend2 == 532){ 11 | cout << a << " " << b << " " << c << endl; 12 | } 13 | } 14 | } 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /2.5数组/26051.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a[15]; 5 | int i,j,tem; 6 | for(i = 0;i < 10;i++){ 7 | scanf("%d",&a[i]); 8 | } 9 | for(i = 0;i < 9;i++){ 10 | for(j = 0;j < 9 - i;j++){ 11 | if(a[j] > a[j + 1]){ 12 | tem = a[j]; 13 | a[j] = a[j + 1]; 14 | a[j + 1] = tem; 15 | } 16 | } 17 | } 18 | for(i = 0;i < 10;i++){ 19 | printf("%d\n",a[i]); 20 | } 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /3.1简单模拟/6170.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char a[20],b[20]; 6 | char da,db; 7 | int num1 = 0,num2 = 0; 8 | scanf("%s %c %s %c",a,&da,b,&db); 9 | for(int i = 0;i < strlen(a);i++){ 10 | if(a[i] == da){ 11 | num1 = num1 * 10 + (int)(da - '0'); 12 | } 13 | } 14 | for(int i = 0;i < strlen(b);i++){ 15 | if(b[i] == db){ 16 | num2 = num2 * 10 + (int)(db - '0'); 17 | } 18 | } 19 | printf("%d\n",num1 + num2); 20 | } 21 | -------------------------------------------------------------------------------- /3.2查找元素/1932.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int n; 5 | while(scanf("%d",&n) && n){ 6 | int num_of_s[1100]; 7 | for(int i = 0;i < n;i++){ 8 | int value; 9 | scanf("%d",&value); 10 | num_of_s[i] = value; 11 | } 12 | int m,count = 0; 13 | scanf("%d",&m); 14 | for(int i = 0;i < n;i++){ 15 | if(m == num_of_s[i]) 16 | count++; 17 | } 18 | printf("%d\n",count); 19 | } 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /5.1简单数学/1957.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int n; 6 | while(cin >> n){ 7 | for(int i = 0;i <= (n/5);i++){ 8 | for(int j = 0;j <= (n - 5 * i) / 3;j++){ 9 | for(int k = 0;k <= (n - 5 * i - 3 * j) * 3;k++){ 10 | if(i + j + k == 100){ 11 | cout << "x=" << i << ",y=" << j << ",z=" << k << endl; 12 | } 13 | } 14 | } 15 | } 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /5.1简单数学/2000.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int m; 6 | cin >> m; 7 | while(m-- > 0){ 8 | int n; 9 | cin >> n; 10 | int result = 0; 11 | if(n >= 0){ 12 | for(int i = n;i <= 2 * n;i++){ 13 | result += i; 14 | } 15 | } 16 | if(n < 0){ 17 | for(int i = 2 * n;i <= n;i++){ 18 | result += i; 19 | } 20 | } 21 | cout << result << endl; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /3.5进制转换/1941(2).cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void change(long long s,long long m) 4 | { 5 | if(s) 6 | { 7 | change(s / m,m); 8 | printf("%lld",s%m);// first output 9 | } 10 | } 11 | int main() 12 | { 13 | long long a,b,m,s; 14 | while(scanf("%lld",&m),m) 15 | { 16 | scanf("%lld%lld",&a,&b); 17 | s = a + b; 18 | if(s == 0) 19 | printf("0"); 20 | else 21 | change(s,m);//使用递归输出 22 | printf("\n"); 23 | } 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /2.6函数/26339.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | void exchange(char a[100]) 6 | { 7 | int temp,i,n; 8 | n = strlen(a); 9 | for(i = 0;i < n / 2;i++){ 10 | temp = a[i]; 11 | a[i] = a[n - i - 1]; 12 | a[n - i - 1] = temp; 13 | } 14 | } 15 | int main() 16 | { 17 | char a[1000]; 18 | gets(a); 19 | exchange(a); 20 | int len = strlen(a); 21 | for(int i = 0;i < len;i++){ 22 | cout << a[i]; 23 | } 24 | cout << "\n"; 25 | } 26 | -------------------------------------------------------------------------------- /5.1简单数学/1996.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int a,b,c; 6 | for(a = 0;a <= 9;a++){ 7 | for(b = 0;b <= 9;b++){ 8 | for(c = 0; c <= 9;c++){ 9 | int factor1 = a * 100 + b * 10 + c; 10 | int factor2 = b * 100 + c * 10 + c; 11 | int result = factor1 + factor2; 12 | if(result == 532) 13 | cout << a << " " << b << " " << c << endl; 14 | } 15 | } 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /6.9algorithm头文件详解/1801.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int n; 5 | while(scanf("%d",&n) != EOF){ 6 | int temp; 7 | scanf("%d",&temp); 8 | int max = temp,min = temp; 9 | for(int i = 0;i < n - 1;i++){ 10 | scanf("%d",&temp); 11 | if(temp > max){ 12 | max = temp; 13 | } 14 | else if(temp < min){ 15 | min = temp; 16 | } 17 | } 18 | printf("%d %d\n",max,min); 19 | } 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /5.1简单数学/2024.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | int m; 7 | cin >> m; 8 | while(m-- > 0){ 9 | int n,x,result = 0; 10 | cin >> n; 11 | int a[11]; 12 | for(int i = 0;i <= n;i++){ 13 | cin >> a[i]; 14 | } 15 | cin >> x; 16 | for(int i = 0;i <= n;i++){ 17 | int temp_result = a[i] * pow(x,i); 18 | result += temp_result; 19 | } 20 | cout << result << endl; 21 | } 22 | return 0; 23 | } 24 | -------------------------------------------------------------------------------- /3.3图形输出/1993.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main(){ 5 | char str[100]; 6 | gets(str); 7 | int N = strlen(str); 8 | int n1 = (N + 2) / 3, n3 = n1,n2 = N + 2 - n1 - n3; 9 | for (int i = 0; i < n1 - 1; i++){ 10 | printf("%c", str[i]); 11 | for (int j = 0; j < n2 - 2; j++){ 12 | printf(" "); 13 | } 14 | printf("%c\n", str[N - i - 1]); 15 | } 16 | for (int i = n1 - 1; i <= n2 + n1 - 2; i++){ 17 | printf("%c", str[i]); 18 | } 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /2.3选择结构/25354.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | double i,bonus; 5 | scanf("%lf",&i); 6 | if(i <= 100000) 7 | bonus = i * 0.1; 8 | else if(i > 100000 && i <= 200000) 9 | bonus = 10000 + (i - 100000) * 0.075; 10 | else if(i > 200000 && i <= 400000) 11 | bonus = 17500 + (i - 20000) * 0.05; 12 | else if(i > 400000 && i <= 600000) 13 | bonus = 27500 + (i - 40000) * 0.03; 14 | else if(i > 600000 && i <= 1000000) 15 | bonus = 33500 + (i - 600000) * 0.01; 16 | printf("%.2lf",bonus); 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /5.2最大公约数和最小公倍数/2136.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int gcb(int a,int b) 4 | { 5 | return !b ? a : gcb(b,a % b); 6 | } 7 | int lcm(int a,int b) 8 | { 9 | return a / gcb(a,b) * b; 10 | } 11 | int main() 12 | { 13 | int m; 14 | cin >> m; 15 | while(m-- > 0){ 16 | int n; 17 | cin >> n; 18 | int temp2 = 1; 19 | for(int i = 0;i < n;i++){ 20 | int temp1; 21 | cin >> temp1; 22 | temp2 = lcm(temp1,temp2); 23 | } 24 | cout << temp2 << endl; 25 | } 26 | return 0; 27 | } 28 | -------------------------------------------------------------------------------- /3.6字符串处理/1785.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char a[110],b[110],c[220]; 6 | while(scanf("%s %s",a,b) != EOF){ 7 | memset(c,0,sizeof(c)); 8 | int i,j,k; 9 | //a copy to c 10 | for(i = 0,k = 0;i < strlen(a);i++,k++) 11 | c[k] = a[i]; 12 | //b copy to c 13 | for(j = 0,k = strlen(a);j < strlen(b);j++,k++) 14 | c[k] = b[j]; 15 | //output c 16 | for(k = 0;k < strlen(c);k++) 17 | printf("%c",c[k]); 18 | printf("\n"); 19 | } 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /5.1简单数学/2068.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool cmp(int a,int b) 5 | { 6 | return a < b; 7 | } 8 | int main() 9 | { 10 | int m; 11 | cin >> m; 12 | while(m-- > 0){ 13 | int n; 14 | cin >> n; 15 | if(n % 2 != 0){ 16 | cout << "0 0" << endl; 17 | } 18 | else if(n % 4 == 0){ 19 | cout << n / 4 << " " << n / 2 << endl; 20 | } 21 | else if(n % 2 == 0){ 22 | cout << n / 4 + 1 << " " << n / 2 << endl; 23 | } 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /11.1动态规划专题-动态规划的递归写法和递推写法/1795.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int f(int n) 4 | { 5 | if (n == 0) 6 | return 0; 7 | else if (n == 1) 8 | return 1; 9 | int f0 = 0, f1 = 1; 10 | int result = 0; 11 | for (int i = 2; i <= n; i++) 12 | { 13 | result = f0 + f1; 14 | f0 = f1; 15 | f1 = result; 16 | } 17 | return result; 18 | } 19 | int main() 20 | { 21 | int n; 22 | while (cin >> n) 23 | cout << f(n) << endl; 24 | } 25 | -------------------------------------------------------------------------------- /4.5二分/1934.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int a[210]; 4 | int main() 5 | { 6 | int n; 7 | while(scanf("%d",&n) != EOF){ 8 | for(int i = 0;i < n;i++){ 9 | scanf("%d",&a[i]); 10 | } 11 | int x; 12 | scanf("%d",&x); 13 | int j; 14 | for(j = 0;j < n;j++){ 15 | if(a[j] == x){ 16 | printf("%d\n",j); 17 | break; 18 | } 19 | } 20 | if(j == n){ 21 | printf("-1\n"); 22 | } 23 | memset(a,0,sizeof(a)); 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /2.5数组/26055.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char str1[1000],str2[1000],str3[1000]; 6 | int cmp1,cmp2; 7 | gets(str1); 8 | gets(str2); 9 | gets(str3); 10 | cmp1 = strcmp(str1,str2); 11 | if(cmp1 >= 0){ 12 | cmp2 = strcmp(str1,str3); 13 | if(cmp2 >= 0) 14 | puts(str1); 15 | else 16 | puts(str3); 17 | } 18 | if(cmp1 < 0){ 19 | cmp2 = strcmp(str2,str3); 20 | if(cmp2 >= 0) 21 | puts(str2); 22 | else 23 | puts(str3); 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /2.8结构体/1303.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | struct person{ 6 | char name[20]; 7 | int count; 8 | }leader[3] = {"Li",0,"Zhang",0,"Fun",0}; 9 | int main() 10 | { 11 | int i,j,n; 12 | cin >> n; 13 | char name[20]; 14 | for(i = 0;i < n;i++){ 15 | scanf("%s",name); 16 | for(j = 0;j < 3;j++){ 17 | if(strcmp(name,leader[j].name) == 0) 18 | leader[j].count++; 19 | } 20 | } 21 | for(i = 0;i < 3;i++){ 22 | cout << leader[i].name << ":" << leader[i].count << '\n'; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /5.1简单数学/2048.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int judge_seven(int i) 4 | { 5 | if(i % 7 == 0) 6 | return 1; 7 | int a = i % 10; 8 | int b = i / 10; 9 | if(a == 7 || b == 7) 10 | return 1; 11 | return 0; 12 | } 13 | int main() 14 | { 15 | int n; 16 | while(cin >> n){ 17 | int result = 0; 18 | for(int i = 1;i <= n;i++){ 19 | if(i % 7 == 0 || judge_seven(i) == 1) 20 | continue; 21 | else{ 22 | result += i * i; 23 | } 24 | } 25 | cout << result << endl; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /3.3图形输出/2506.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int n; 5 | while(scanf("%d",&n) != EOF){ 6 | for(int i = 0;i < n - 1;i++){ 7 | for(int j = 0;j < i;j++) 8 | printf(" "); 9 | for(int j = 0;j < n - i;j++) 10 | printf("* "); 11 | printf("\n"); 12 | } 13 | for(int i = 0;i < n;i++){ 14 | for(int j = 0;j < n - 1 - i;j++) 15 | printf(" "); 16 | for(int j = 0;j < i + 1;j++) 17 | printf("* "); 18 | printf("\n"); 19 | } 20 | } 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /3.4日期处理/1931.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | bool isLeapYear(int year) 3 | { 4 | return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); 5 | } 6 | int main() 7 | { 8 | int year,day; 9 | while(scanf("%d %d",&year,&day) != EOF){ 10 | int dayOfMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 11 | if(isLeapYear(year)) 12 | dayOfMonth[2] += 1; 13 | int month = 1; 14 | while(day > dayOfMonth[month]){ 15 | day -= dayOfMonth[month]; 16 | month++; 17 | } 18 | printf("%04d-%02d-%02d\n",year,month,day); 19 | } 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /5.4素数/2125.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool is_prime(int n) 5 | { 6 | int sqr = (int) sqrt(1.0 * n); 7 | for(int i = 2;i <= sqr;i++){ 8 | if(n % i == 0){ 9 | return false; 10 | break; 11 | } 12 | } 13 | return true; 14 | } 15 | int main() 16 | { 17 | int n; 18 | while(cin >> n && n != 0){ 19 | int count = 0; 20 | for(int i = 2;i <= n/2;i++){ 21 | if(is_prime(i) && is_prime(n - i)) 22 | count++; 23 | } 24 | cout << count << endl; 25 | } 26 | return 0; 27 | } 28 | -------------------------------------------------------------------------------- /4.1排序/1925.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | int n,a[1100]; 7 | while(scanf("%d",&n) != EOF){ 8 | if(n == 1){ 9 | scanf("%d",&a[0]); 10 | printf("%d\n",a[0]); 11 | printf("-1\n"); 12 | } 13 | else{ 14 | for(int i = 0;i < n;i++) 15 | scanf("%d",&a[i]); 16 | sort(a,a + n); 17 | printf("%d\n",a[n-1]); 18 | for(int i = 0;i < n-1;i++) 19 | printf("%d ",a[i]); 20 | printf("\n"); 21 | } 22 | } 23 | return 0; 24 | } 25 | -------------------------------------------------------------------------------- /11.7 背包问题/21869.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 10010; 5 | const int maxv = 10010; 6 | int w[maxn]; 7 | long long dp[maxv]; 8 | int main() 9 | { 10 | int n,v; 11 | while(cin >> n >> v) 12 | { 13 | fill(w,w+maxn,0); 14 | for(int i = 0;i < n;i++) 15 | cin >> w[i]; 16 | fill(dp,dp+maxn,0); 17 | dp[0] = 1; 18 | sort(w,w + n); 19 | for(int i = 0;i < n;i++) 20 | for(int j = w[i];j <= v;j++) 21 | dp[j] = dp[j] + dp[j - w[i]]; 22 | cout << dp[v] << endl; 23 | } 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /9.2二叉树的遍历/1905.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | int m,n; 8 | while(cin >> m >> n && m != 0 && n != 0){ 9 | int layer = 0,left = m,num = 1; 10 | while(2 * m + 1 <= n){ 11 | layer++; 12 | num += pow(2,layer); 13 | m = m * 2 + 1; 14 | left *= 2; 15 | if(m == n) 16 | break; 17 | } 18 | if(left * 2 < n){ 19 | left = left * 2; 20 | num = num + (n - left + 1); 21 | } 22 | printf("%d\n",num); 23 | } 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /5.1简单数学/1968.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | int n; 7 | while(cin >> n){ 8 | int a[11] = {0}; 9 | a[n]++; 10 | int temp; 11 | for(int i = 1;i < 20;i++){ 12 | cin >> temp; 13 | a[temp]++; 14 | } 15 | //result:index , a[result]:maxValue 16 | int result = 0; 17 | for(int i = 1;i <= 10;i++){ 18 | if(a[i] > a[result]){ 19 | a[result] = a[i]; 20 | result = i; 21 | } 22 | } 23 | cout << result << endl; 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /11.7 背包问题/24338.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 20010; 5 | const int maxv = 20010; 6 | int w[maxn],dp[maxv]; 7 | int main() 8 | { 9 | int n,v; 10 | cin >> v >> n; 11 | for(int i = 1;i <= n;i++) 12 | cin >> w[i]; 13 | for(int i = 0;i <= v;i++) 14 | dp[i] = 0; 15 | for(int i = 1;i <= n;i++) 16 | for(int j = v;j >= w[i];j--) 17 | dp[j] = max(dp[j],dp[j - w[i]] + w[i]); 18 | int maxr = 0; 19 | for(int i = 0;i <= v;i++) 20 | if(dp[i] > maxr) 21 | maxr = dp[i]; 22 | cout << v - maxr << endl; 23 | return 0; 24 | } 25 | -------------------------------------------------------------------------------- /2.8结构体/1309.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | struct student{ 3 | int num; 4 | char name[20]; 5 | int score1; 6 | int score2; 7 | int score3; 8 | }stu[100]; 9 | void input(struct student s[]) 10 | { 11 | int i; 12 | for(i = 0;i < 5;i++){ 13 | scanf("%d %s %d %d %d",&s[i].num,s[i].name,&s[i].score1,&s[i].score2,&s[i].score3); 14 | } 15 | } 16 | void output(struct student s[]) 17 | { 18 | int i; 19 | for(i = 0;i < 5;i++){ 20 | printf("%d %s %d %d %d\n",s[i].num,s[i].name,s[i].score1,s[i].score2,s[i].score3); 21 | } 22 | } 23 | int main() 24 | { 25 | input(stu); 26 | output(stu); 27 | return 0; 28 | } 29 | -------------------------------------------------------------------------------- /3.2查找元素/1934.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int n; 5 | while(scanf("%d",&n) != EOF){ 6 | int a[210]; 7 | for(int i = 0;i < n;i++){ 8 | int value; 9 | scanf("%d",&value); 10 | a[i] = value; 11 | } 12 | int m; 13 | bool exist = false; 14 | scanf("%d",&m); 15 | for(int j = 0;j < n;j++){ 16 | if(a[j] == m){ 17 | printf("%d\n",j); 18 | exist = true; 19 | break; 20 | } 21 | } 22 | if(exist == false) 23 | printf("-1\n"); 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /5.5质因子分解/1948.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int count_fact(int n) 4 | { 5 | if(n == 1) 6 | return 1; 7 | int count = 0; 8 | for(int i = 1;i < sqrt(n);i++){ 9 | if(n % i == 0){ 10 | count += 2; 11 | } 12 | } 13 | if((int)(sqrt(n)) * (int)(sqrt(n)) == n){ 14 | count++; 15 | } 16 | return count; 17 | } 18 | int main() 19 | { 20 | int m; 21 | while(scanf("%d",&m) != EOF && m != 0){ 22 | int n; 23 | for(int i = 0;i < m;i++){ 24 | scanf("%d",&n); 25 | printf("%d\n",count_fact(n)); 26 | } 27 | } 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /12.2KMP算法/3708.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | string s, p; 8 | while (cin >> s >> p) 9 | { 10 | int num = 0; 11 | while (s.length() >= p.length()) 12 | { 13 | if (s.find(p) != string::npos) 14 | { 15 | num++; 16 | s.erase(s.find(p), p.length()); 17 | } 18 | else 19 | break; 20 | } 21 | if (num != 0) 22 | cout << num << endl; 23 | else 24 | cout << 0 << endl; 25 | } 26 | return 0; 27 | } 28 | 29 | -------------------------------------------------------------------------------- /3.1简单模拟/1817.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char num1[20],num2[20]; 6 | while(scanf("%s%s",num1,num2) != EOF) 7 | { 8 | int sum1 = 0,sum2 = 0; 9 | int len1 = strlen(num1); 10 | int len2 = strlen(num2); 11 | for(int i = 0; i < len1; i++){ 12 | if(num1[i] >= '0' && num1[i] <= '9') 13 | sum1 = sum1 * 10 + num1[i] - '0'; 14 | } 15 | if(num1[0] == '-') 16 | sum1 = -sum1; 17 | for(int j = 0;j < len2;j++){ 18 | if(num2[j] >= '0' && num2[j] <= '9') 19 | sum2 = sum2 * 10 + num2[j] - '0'; 20 | } 21 | 22 | if(num2[0] == '-') 23 | sum2 = -sum2; 24 | printf("%d\n",sum1 + sum2); 25 | } 26 | return 0; 27 | } 28 | -------------------------------------------------------------------------------- /3.6字符串处理/2064.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | int n,first,index; 6 | char str[100][100]; 7 | while(scanf("%d",&n) != EOF){ 8 | for(int i = 0;i < n;i++){ 9 | scanf("%s",str[i]); 10 | first = 0; 11 | if(i < 3) 12 | index = i + 1; 13 | else 14 | index = 4; 15 | for(int j = 0;j < index;j++){ 16 | if(first) 17 | printf(" "); 18 | first = 1; 19 | printf("%d=%s",j+1,str[i-j]); 20 | } 21 | printf("\n"); 22 | } 23 | } 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /5.4素数/1946.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool is_prime(int n) 5 | { 6 | int sqr = (int) sqrt(1.0 * n); 7 | for(int i = 2;i <= sqr;i++){ 8 | if(n % i == 0){ 9 | return false; 10 | break; 11 | } 12 | } 13 | return true; 14 | } 15 | int kth_prime(int k) 16 | { 17 | int i = 0; 18 | int a = 2; 19 | while(i < k){ 20 | if(is_prime(a) == true){ 21 | i++; 22 | } 23 | a++; 24 | } 25 | return a - 1; 26 | } 27 | int main() 28 | { 29 | int n; 30 | while(cin >> n){ 31 | cout << kth_prime(n) << endl; 32 | } 33 | return 0; 34 | } 35 | -------------------------------------------------------------------------------- /3.1简单模拟/6116.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | int n; 8 | scanf("%d",&n); 9 | vector dis(n + 1); 10 | int sum = 0,left,right,cnt; 11 | for(int i = 1;i <= n;i++){ 12 | int value; 13 | scanf("%d",&value); 14 | sum += value; 15 | dis[i] = sum; 16 | } 17 | scanf("%d",&cnt); 18 | for(int i = 0;i < cnt;i++){ 19 | scanf("%d %d",&left,&right); 20 | if(left > right) 21 | swap(left,right); 22 | int temp = dis[right - 1] - dis[left - 1]; 23 | printf("%d\n",min(temp,sum - temp)); 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /3.2查找元素/1937.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main(){ 3 | int n,m,a[101],b[101]; 4 | while(scanf("%d",&n) != EOF){ 5 | for(int i = 0;i < n;i++){ 6 | scanf("%d",&a[i]); 7 | } 8 | scanf("%d",&m); 9 | for(int i = 0;i < m;i++){ 10 | scanf("%d",&b[i]); 11 | } 12 | for(int i = 0;i < m;i++){ 13 | int j; 14 | for(j = 0;j < n;j++){ 15 | if(b[i] == a[j]){ 16 | printf("YES\n"); 17 | break; 18 | } 19 | } 20 | if(j == n){ 21 | printf("NO\n"); 22 | } 23 | } 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /11.7 背包问题/24339.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 1010; 5 | const int maxv = 1010; 6 | int t[maxn],c[maxn],dp[maxv]; 7 | int main() 8 | { 9 | int num,time; 10 | cin >> time >> num; 11 | for(int i = 1;i <= num;i++) 12 | { 13 | cin >> t[i] >> c[i]; 14 | } 15 | for(int i = 0;i <= time;i++) 16 | dp[i] = 0; 17 | for(int i = 1;i <= num;i++) 18 | for(int j = time;j >= t[i];j--) 19 | dp[j] = max(dp[j],dp[j - t[i]] + c[i]); 20 | int maxr = 0; 21 | for(int i = 0;i <= time;i++) 22 | if(dp[i] > maxr) 23 | maxr = dp[i]; 24 | cout << maxr << endl; 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /2.5数组/26041.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int a[20][20],n; 5 | scanf("%d",&n); 6 | for(int i = 0;i < n;i++){ 7 | for(int j = 0;j < n;j++){ 8 | if(i == j) 9 | a[i][j] = 1; 10 | } 11 | }//最外层 12 | 13 | for(int i = 1;i < n;i++){ 14 | a[i][0] = 1; 15 | }//第一列 16 | 17 | for(int i = 2;i < n;i++){ 18 | for(int j = 1;j < i;j++){ 19 | a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; 20 | } 21 | }//中间需要相加的部分 22 | 23 | for(int i = 0;i < n;i++){ 24 | for(int j = 0;j <= i;j++){ 25 | printf("%d ",a[i][j]); 26 | } 27 | printf("\n"); 28 | }//输出 29 | return 0; 30 | } 31 | -------------------------------------------------------------------------------- /6.8pair用法详解/1114.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | int main() 7 | { 8 | pair p1; 9 | pair p2; 10 | pair p3; 11 | pair result; 12 | int n; 13 | while(cin >> n && n != 0){ 14 | for(int i = 0;i < n;i++){ 15 | cin >> p1.first >> p1.second >> p2.first >> p2.second >> p3.first >> p3.second; 16 | result.first = (p1.first + p2.first + p3.first) / 3; 17 | result.second = (p1.second + p2.second + p3.second) / 3; 18 | printf("%.1f %.1f\n",result.first,result.second); 19 | } 20 | } 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /8.1深度优先搜索DFS/5972.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int n,a[110]; 6 | bool v[110]; 7 | void dfs(int k) 8 | { 9 | int i; 10 | if(k == n+1) 11 | { 12 | for(i = 1;i < n;i++) 13 | { 14 | printf("%d ",a[i]); 15 | } 16 | printf("%d\n",a[n]); 17 | } 18 | else 19 | { 20 | for(i = 1;i <= n;i++) 21 | if( v[i]) 22 | { 23 | v[i] = 0; 24 | a[k] = i; 25 | dfs(k + 1); 26 | v[i] = 1; 27 | } 28 | } 29 | } 30 | int main() 31 | { 32 | scanf("%d",&n); 33 | memset(v,1,sizeof(v)); 34 | dfs(1); 35 | return 0; 36 | } 37 | -------------------------------------------------------------------------------- /11.3动态规划最长不下降子序列/21280.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 1100; 5 | int a[maxn], dp[maxn]; 6 | int main() 7 | { 8 | int n; 9 | while (cin >> n) 10 | { 11 | for (int i = 1; i <= n; i++) 12 | { 13 | cin >> a[i]; 14 | } 15 | int ans = 0; 16 | for (int i = 1; i <= n; i++) 17 | { 18 | dp[i] = 1; 19 | for (int j = 1; j < i; j++) 20 | { 21 | if (a[i] >= a[j] && dp[j] + 1 > dp[i]) 22 | dp[i] = dp[j] + 1; 23 | } 24 | ans = max(ans, dp[i]); 25 | } 26 | cout << ans << endl; 27 | } 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /3.1简单模拟/1814.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int main(){ 3 | int l,m; 4 | while(scanf("%d %d",&l,&m) != EOF){ 5 | if(l == 0 && m == 0)break; 6 | else{ 7 | int countn = 0; 8 | int trees[100010] = {0}; 9 | for(int i = 0;i < m;i++){ 10 | int left,right; 11 | scanf("%d %d",&left,&right); 12 | for(int j = left;j <= right;j++){ 13 | trees[j] = 1; 14 | } 15 | } 16 | for(int i = 0;i <= l;i++){ 17 | if(trees[i] == 0)countn++; 18 | } 19 | printf("%d\n",countn); 20 | } 21 | } 22 | return 0; 23 | } 24 | -------------------------------------------------------------------------------- /3.2查找元素/2020.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | struct Student{ 3 | int id; 4 | char name[100]; 5 | char sex[100]; 6 | int age; 7 | }student[21]; 8 | int main() 9 | { 10 | int i,j,n,m,number; 11 | scanf("%d",&m); 12 | while(m--){ 13 | scanf("%d",&n); 14 | for(j = 0;j < n;j++){ 15 | scanf("%d %s %s %d\n",&student[j].id,student[j].name,student[j].sex,&student[j].age); 16 | } 17 | scanf("%d",&number); 18 | for(j = 0;j < n;j++){ 19 | if(student[j].id == number){ 20 | printf("%d %s %s %d\n",student[j].id,student[j].name,student[j].sex,student[j].age); 21 | break; 22 | } 23 | } 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /4.2哈希/1782.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int result[210]; 6 | int num[210]; 7 | 8 | int main() 9 | { 10 | int n, m; 11 | while(cin >> n >> m){ 12 | int a; 13 | for(int i = 0; i < n; i++) 14 | { 15 | cin >> a; 16 | result[i] = a; 17 | num[a]++; 18 | } 19 | for(int i = 0; i < n; i++) 20 | { 21 | if(num[result[i]] == 1) 22 | cout << "BeiJu" << endl; 23 | else 24 | cout << num[result[i]-1] << endl; 25 | } 26 | // 27 | memset(result,0,sizeof(int)*210); 28 | memset(num,0,sizeof(int)*210); 29 | } 30 | return 0; 31 | } 32 | -------------------------------------------------------------------------------- /4.2哈希/6112.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int a[100010],b[100010]; 5 | int main() 6 | { 7 | int n; 8 | while(cin >> n){ 9 | for(int i = 0;i < n;i++) 10 | { 11 | int temp; 12 | cin >> temp; 13 | a[temp]++;//哈希 14 | b[i] = temp;//按顺序存数 15 | } 16 | int j; 17 | for(j = 0;j < n;j++) 18 | { 19 | if(a[b[j]] == 1){ 20 | cout << b[j] << endl; 21 | break; 22 | } 23 | } 24 | if(j == n) 25 | cout << "None" << endl; 26 | memset(a,0,sizeof(int)*10001); 27 | memset(b,0,sizeof(int)*10001); 28 | } 29 | return 0; 30 | } 31 | -------------------------------------------------------------------------------- /4.4贪心/2143.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | bool cmp(double a,double b) 6 | { 7 | return a < b; 8 | } 9 | int main() 10 | { 11 | int c; 12 | cin >> c; 13 | while(c--){ 14 | int n,v,i; 15 | double w,sum = 0,p = 0,an[105]; 16 | scanf("%d%d%lf",&n,&v,&w); 17 | for(i = 0;i < n;i++) 18 | { 19 | scanf("%lf",&an[i]); 20 | } 21 | sort(an,an+n,cmp); 22 | for(i = 0;i < n;i++) 23 | { 24 | sum += an[i]; 25 | if(sum / (double)(i+1) <= w) 26 | { 27 | p = sum / (double)(i+1); 28 | } 29 | else 30 | break; 31 | } 32 | if(i == 0) 33 | printf("0 0.00\n"); 34 | else 35 | printf("%d %.2f\n",i * v,p / (double)100); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /5.5质因子分解/1997.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int count_sum(int n) 4 | { 5 | int count = 0; 6 | for(int i = 1;i < n;i++){ 7 | if(n % i == 0) 8 | count += i; 9 | } 10 | return count; 11 | } 12 | int main() 13 | { 14 | int a[60],b[60]; 15 | int k = 0,l = 0; 16 | for(int i = 2;i <= 60;i++){ 17 | if(count_sum(i) == i){ 18 | a[k++] = i; 19 | } 20 | else if(count_sum(i) > i){ 21 | b[l++] = i; 22 | } 23 | } 24 | cout << "E: "; 25 | for(int i = 0;i < k;i++){ 26 | cout << a[i] << " "; 27 | } 28 | cout << "G: "; 29 | for(int i = 0;i < l;i++){ 30 | cout << b[i] << " "; 31 | } 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /11.4最长公共子序列/1132.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | const int maxn = 110; 6 | char a[maxn], b[maxn]; 7 | int main() 8 | { 9 | while (cin >> a >> b) 10 | { 11 | int dp[maxn][maxn] = { 0 }; 12 | int len1 = strlen(a); 13 | int len2 = strlen(b); 14 | for (int i = 1; i <= len1; i++) 15 | { 16 | for (int j = 1; j <= len2; j++) 17 | { 18 | if (a[i-1] == b[j-1]) 19 | dp[i][j] = dp[i - 1][j - 1] + 1; 20 | else 21 | dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 22 | } 23 | } 24 | cout << dp[len1][len2] << endl; 25 | } 26 | return 0; 27 | } -------------------------------------------------------------------------------- /5.4素数/1945.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool is_prime(int n) 5 | { 6 | if(n <= 1) 7 | return false; 8 | int sqr = (int)sqrt(1.0 * n); 9 | for(int i = 2;i <= sqr;i++){ 10 | if(n % i == 0) 11 | return false; 12 | } 13 | return true; 14 | } 15 | int main() 16 | { 17 | int n; 18 | while(cin >> n){ 19 | int count = 0; 20 | for(int i = 2;i < n;i++){ 21 | if(is_prime(i) == true && i % 10 == 1){ 22 | cout << i << " "; 23 | count++; 24 | } 25 | } 26 | if(count > 0) 27 | cout << endl; 28 | else 29 | cout << "-1" << endl; 30 | } 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /4.4贪心/2132.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | bool cmp(int a,int b) 6 | { 7 | return a > b; 8 | } 9 | int main() 10 | { 11 | long long l; 12 | int n; 13 | while(cin >> l >> n){ 14 | int block[610]; 15 | for(int i = 0;i < n;i++){ 16 | cin >> block[i]; 17 | } 18 | sort(block,block+n,cmp); 19 | int repair = 0; 20 | int j; 21 | for(j = 0;j < n;j++){ 22 | repair += block[j]; 23 | if(repair > l){ 24 | cout << j + 1 << endl; 25 | break; 26 | } 27 | } 28 | if(j == n) 29 | cout << "impossible" << endl; 30 | } 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /2.7指针/1283.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | char *a = new char [20]; 7 | char *b = new char[20]; 8 | char *c = new char[20]; 9 | char *tem = new char[20]; 10 | cin >> a >> b >> c; 11 | if(strcmp(a,b) > 0) 12 | { 13 | tem = a; 14 | a = b; 15 | b = tem; 16 | } 17 | //cout << a << '\n' << b << '\n' << c << '\n'; 18 | if(strcmp(b,c) > 0) 19 | { 20 | tem = b; 21 | b = c; 22 | c = tem; 23 | } 24 | //cout << a << '\n' << b << '\n' << c << '\n'; 25 | if(strcmp(a,b) > 0) 26 | { 27 | tem = b; 28 | b = a; 29 | a = tem; 30 | } 31 | cout << a << '\n' << b << '\n' << c << '\n'; 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /3.6字符串处理/1962.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char s[10000],a[110],b[110],temp[1000][110];//将每一个单词存入二维数组 6 | while(gets(s)){ 7 | int m = 0,n = 0; 8 | memset(temp,0,sizeof(temp)); 9 | gets(a); 10 | gets(b); 11 | for(int i = 0;i < strlen(s);i++){ 12 | if (s[i] != ' '){ 13 | temp[m][n++] = s[i]; 14 | } 15 | else{ 16 | m++; 17 | n = 0; 18 | } 19 | } 20 | for(int i = 0;i <= m;i++){ 21 | if (strcmp(temp[i],a) == 0) 22 | printf("%s ",b); 23 | else 24 | printf("%s ",temp[i]); //二维数组 25 | } 26 | printf("\n"); 27 | } 28 | return 0; 29 | } 30 | 31 | 32 | -------------------------------------------------------------------------------- /6.5queue用法详解/1863.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | int a[15]; 7 | for(int i = 0;i < 10;i++){ 8 | scanf("%d",&a[i]); 9 | } 10 | int index_min = 0; 11 | int index_max = 0; 12 | int min = a[0]; 13 | int max = a[0]; 14 | for(int i = 0;i < 10;i++){ 15 | if(a[i] < min){ 16 | min = a[i]; 17 | index_min = i; 18 | } 19 | if(a[i] > max){ 20 | max = a[i]; 21 | index_max = i; 22 | } 23 | } 24 | 25 | int temp1 = a[index_min]; 26 | a[index_min] = a[0]; 27 | a[0] = temp1; 28 | //如果第一个数是最大的,则交换完最小数后,最大数的位置为最小数原来的位置 29 | if(index_max == 0) 30 | index_max = index_min; 31 | int temp2 = a[index_max]; 32 | a[index_max] = a[9]; 33 | a[9] = temp2; 34 | 35 | for(int i = 0;i < 10;i++){ 36 | printf("%d ",a[i]); 37 | } 38 | return 0; 39 | } -------------------------------------------------------------------------------- /11.8 动态规划总结/2075.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 1100; 5 | int pi[maxn],c[maxn],dp[maxn]; 6 | int main() 7 | { 8 | int C,n; 9 | while(cin >> C >> n) 10 | { 11 | fill(pi,pi + maxn,0); 12 | fill(c,c + maxn,0); 13 | fill(dp,dp + maxn,0); 14 | for(int i = 1;i <= n;i++) 15 | cin >> pi[i] >> c[i]; 16 | for(int j = 0;j < C;j++) 17 | dp[j] = 0; 18 | for(int i = 1;i <= n;i++) 19 | for(int j = C;j >= pi[i];j--) 20 | dp[j] = max(dp[j],dp[j-pi[i]] + c[i]); 21 | int max = 0; 22 | for(int j = 0;j <= C;j++) 23 | { 24 | if(dp[j] > max) 25 | max = dp[j]; 26 | } 27 | cout << max << endl; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /2.6函数/26340.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | void copy(char s1[100],char s2[100]) 6 | { 7 | int i,j; 8 | int len1 = strlen(s1); 9 | i = 0,j = 0; 10 | while(i< len1){ 11 | if(s1[i] == 'a' || 12 | s1[i] == 'e' || 13 | s1[i] == 'i' || 14 | s1[i] == 'o' || 15 | s1[i] == 'u' || 16 | s1[i] == 'A' || 17 | s1[i] == 'E' || 18 | s1[i] == 'I' || 19 | s1[i] == 'O' || 20 | s1[i] == 'U'){ 21 | s2[j] = s1[i]; 22 | i++; 23 | j++; 24 | } 25 | else i++; 26 | } 27 | s2[j] = '\0'; 28 | } 29 | int main() 30 | { 31 | char a[100],b[100]; 32 | gets(a); 33 | copy(a,b); 34 | puts(b); 35 | return 0; 36 | } 37 | -------------------------------------------------------------------------------- /2.7指针/1284.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | void input(int *a) 4 | { 5 | int i; 6 | for(i = 0;i < 10;i++){ 7 | cin >> *(a + i); 8 | } 9 | } 10 | void find(int *a) 11 | { 12 | int *i,*max = a,*min = a,temp; 13 | for(i = a + 1;i < a + 10;i++){ 14 | if(*i > *max){ 15 | max = i; 16 | } 17 | if(*i < *min){ 18 | min = i; 19 | } 20 | } 21 | temp = *a; 22 | *a = *min; 23 | *min = temp; 24 | temp = *(a + 9); 25 | *(a + 9) = *max; 26 | *max = temp; 27 | } 28 | void output(int *a) 29 | { 30 | int i; 31 | for(i = 0;i < 10;i++){ 32 | cout << *(a + i) << ' '; 33 | } 34 | cout << '\n'; 35 | } 36 | int main() 37 | { 38 | int a[20]; 39 | input(a); 40 | find(a); 41 | output(a); 42 | return 0; 43 | } 44 | -------------------------------------------------------------------------------- /5.5质因子分解/1783.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | bool is_perfect_num(int n) 4 | { 5 | int a[n]; 6 | int k = 0; 7 | for(int i = 1;i < n;i++){ 8 | if(n % i == 0) 9 | a[k++] = i; 10 | } 11 | int result = 0; 12 | for(int i = 0;i < k;i++){ 13 | result += a[i]; 14 | } 15 | if(result == n) 16 | return true; 17 | return false; 18 | } 19 | int main() 20 | { 21 | int n; 22 | while(cin >> n){ 23 | int count = 0; 24 | int a[n]; 25 | int k = 0; 26 | for(int i = 1;i <= n;i++){ 27 | if(is_perfect_num(i)){ 28 | a[k++] = i; 29 | } 30 | } 31 | for(int i = 0;i < k - 1;i++){ 32 | cout << a[i] << " "; 33 | } 34 | cout << a[k-1] << endl; 35 | } 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /3.6字符串处理/2025.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | void output(char s[]); 4 | int main() 5 | { 6 | int n; 7 | char a[60],b[60]; 8 | scanf("%d",&n); 9 | while(n--){ 10 | scanf("%s %s",a,b); 11 | if(strlen(a) > strlen(b)){ 12 | output(a); 13 | printf(" is longer than "); 14 | output(b); 15 | } 16 | else if(strlen(a) < strlen(b)){ 17 | output(a); 18 | printf(" is shorter than "); 19 | output(b); 20 | } 21 | else if(strlen(a) == strlen(b)){ 22 | output(a); 23 | printf(" is equal long to "); 24 | output(b); 25 | } 26 | printf("\n"); 27 | } 28 | return 0; 29 | } 30 | void output(char s[]) 31 | { 32 | for(int i = 0;i < strlen(s);i++) 33 | printf("%c",s[i]); 34 | } 35 | -------------------------------------------------------------------------------- /5.1简单数学/1970.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int a[2][3],b[3][2],c[2][2]; 6 | int a00; 7 | while(cin >> a00){ 8 | a[0][0] = a00; 9 | cin >> a[0][1] >> a[0][2]; 10 | cin >> a[1][0] >> a[1][1] >> a[1][2]; 11 | for(int i = 0;i < 3;i++){ 12 | for(int j = 0;j < 2;j++){ 13 | cin >> b[i][j]; 14 | } 15 | } 16 | c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]; 17 | c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]; 18 | c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0]; 19 | c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1]; 20 | cout << c[0][0] << " " << c[0][1] << endl; 21 | cout << c[1][0] << " " << c[1][1] << endl; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /9.3树的遍历/1914.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | int n,a[1100],line; 8 | while(cin >> n && n != 0){ 9 | for(int i = 1;i <= n;i++){ 10 | cin >> a[i]; 11 | } 12 | cin >> line; 13 | int aStart = pow(2,line-1); 14 | int aEnd = pow(2,line) - 1; 15 | if(n < aStart){ 16 | cout << "EMPTY" << endl; 17 | } 18 | else if (aStart <= n && n <= aEnd){ 19 | for(int i = aStart;i <= n;i++){ 20 | cout << a[i] << " "; 21 | } 22 | cout << endl; 23 | } 24 | else if(n > aEnd){ 25 | for(int i = aStart;i <= aEnd;i++){ 26 | cout << a[i] << " "; 27 | } 28 | cout << endl; 29 | } 30 | } 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /3.6字符串处理/1962(2).c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | char a[101],b[101],c[101],tmp[101]; 6 | int i,j; 7 | while(gets(a)){ 8 | gets(b); 9 | gets(c); 10 | int len = strlen(a); 11 | for(i = j = 0;i <= len;i++) 12 | { 13 | if(a[i] != ' ' && a[i] != '\0'){ 14 | tmp[j++] = a[i]; 15 | } 16 | else if(a[i] == ' '){ 17 | tmp[j] = '\0'; 18 | if(strcmp(b,tmp) == 0)printf("%s ",c); 19 | else printf("%s ",tmp); 20 | j = 0;//prepare for next word 21 | } 22 | else if(a[i] == '\0'){ 23 | tmp[j] = '\0'; 24 | if(strcmp(b,tmp) == 0)printf("%s\n",c); 25 | else printf("%s\n",tmp); 26 | } 27 | } 28 | } 29 | return 0; 30 | } 31 | -------------------------------------------------------------------------------- /5.5质因子分解/1947.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool is_prime(int n) 5 | { 6 | int sqr = (int)sqrt(1.0*n); 7 | for(int i = 2;i <= sqr;i++){ 8 | if(n % i == 0)return false; 9 | } 10 | return true; 11 | } 12 | int count_prime_factor(int n) 13 | { 14 | int count = 0; 15 | if(!is_prime(n)){ 16 | while(!is_prime(n)){ 17 | for(int i = 2;i <= n;i++){ 18 | if(is_prime(i) && n % i == 0){ 19 | count++; 20 | n /= i; 21 | break; 22 | } 23 | } 24 | } 25 | count += 1; 26 | } 27 | else 28 | count = 1; 29 | return count; 30 | } 31 | int main() 32 | { 33 | int n; 34 | while(cin >> n){ 35 | int result = count_prime_factor(n); 36 | cout << result << endl; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /8.1深度优先搜索DFS/5974.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | int k,num,n,a[30]; 5 | bool is_prime(int n) 6 | { 7 | if(n <= 1) 8 | return false; 9 | int sqr = (int)sqrt(1.0 * n); 10 | for(int i = 2;i <= sqr;i++){ 11 | if(n % i == 0) 12 | return false; 13 | } 14 | return true; 15 | } 16 | void dfs(int index,int nowK,int sum) 17 | { 18 | if(nowK == k){ 19 | if(is_prime(sum)) 20 | num++; 21 | return; 22 | } 23 | if(index == n || nowK > k)return; 24 | dfs(index + 1,nowK,sum); 25 | if(nowK + 1 <= k){ 26 | dfs(index+1,nowK + 1,sum + a[index]); 27 | } 28 | } 29 | int main() 30 | { 31 | scanf("%d %d",&n,&k); 32 | num = 0; 33 | for(int i = 0;i < n;i++){ 34 | scanf("%d",&a[i]); 35 | } 36 | dfs(0,0,0); 37 | printf("%d\n",num); 38 | 39 | return 0; 40 | } 41 | -------------------------------------------------------------------------------- /5.1简单数学/1939.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | //n bigger than 2 and smaller than 100,so only discuss last two figures 3 | using namespace std; 4 | int main() 5 | { 6 | int n; 7 | while(cin >> n){ 8 | int result = 0; 9 | int m = n * n; 10 | for(int i = 0;i < 2;i++){ 11 | int last = m % 10; 12 | result = last; 13 | if(result == n){ 14 | cout << "Yes!" << endl; 15 | break; 16 | } 17 | if(i == 1){ 18 | m = m / 10; 19 | int last2 = m % 10; 20 | result = last2 * 10 + last; 21 | if(result == n){ 22 | cout << "Yes!" << endl; 23 | break; 24 | } 25 | } 26 | } 27 | if(result != n){ 28 | cout << "No!" << endl; 29 | } 30 | } 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /12.2KMP算法/2987.cpp: -------------------------------------------------------------------------------- 1 | //https://blog.csdn.net/qq_36502291/article/details/89220606 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | int main() { 7 | string s, str; 8 | getline(cin, str); 9 | getline(cin, s); 10 | int num = 0, start, len = str.length(); 11 | transform(str.begin(), str.end(), str.begin(), ::tolower); 12 | transform(s.begin(), s.end(), s.begin(), ::tolower); 13 | s = " " + s; 14 | for (int i = 0; i < s.length(); i++) { 15 | if (s[i] == ' '&& s[i + len + 1] == ' ' && i + len < s.length()) { 16 | string ss = s.substr(i + 1, len); 17 | if (ss == str) 18 | if (num++ == 0) 19 | start = i; 20 | i += len; 21 | } 22 | } 23 | if (num) 24 | cout << num << " " << start << endl; 25 | else 26 | cout << -1 << endl; 27 | return 0; 28 | } 29 | -------------------------------------------------------------------------------- /11.8 动态规划总结/1961.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | const int maxn = 110; 5 | char a[maxn],b[maxn]; 6 | int dp[maxn][maxn]; 7 | int main() 8 | { 9 | int n; 10 | while(scanf("%d",&n) != EOF) 11 | { 12 | gets(a + 1); 13 | gets(b + 1); 14 | int len_a = strlen(a + 1); 15 | int len_b = strlen(b + 1); 16 | for(int i = 0;i <= len_a;i++) 17 | dp[i][0] = 0; 18 | for(int j = 0;j < len_b;j++) 19 | dp[0][j] = 0; 20 | for(int i = 1;i <= len_a;i++) 21 | { 22 | for(int j = 1;j <= len_b;j++) 23 | { 24 | if(a[i] == b[j]) 25 | dp[i][j] = dp[i-1][j-1] + 1; 26 | else 27 | dp[i][j] = std::max(dp[i-1][j],dp[i][j-1]); 28 | } 29 | } 30 | printf("%d\n",dp[len_a][len_b]); 31 | } 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /12.1字符串hash进阶/2432.cpp: -------------------------------------------------------------------------------- 1 | //取出比较短的那个字符串的所有子串,比较是否是比较长的那个字符串的子串 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | string result; 7 | void getMaxSubString(string s1,string s2) 8 | { 9 | string max_ = "",min_ = ""; 10 | int res_len = 0; 11 | max_ = (s1.length() >= s2.length()) ? s1 : s2; 12 | min_ = (max_ == s1) ? s2 : s1; 13 | for(int i = 0;i < min_.length();i++) 14 | { 15 | for(int j = i;j < min_.length();j++) 16 | { 17 | string temp = min_.substr(i,min_.length() - j); 18 | if(max_.find(temp) != string::npos && temp.length() > res_len) 19 | { 20 | result = temp; 21 | res_len = temp.length(); 22 | } 23 | } 24 | 25 | } 26 | } 27 | int main() 28 | { 29 | string s1,s2; 30 | cin >> s1 >> s2; 31 | getMaxSubString(s1,s2); 32 | cout << result << endl; 33 | } 34 | -------------------------------------------------------------------------------- /3.4日期处理/2026.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | struct Date{ 3 | int year = 0,month = 0,day = 0; 4 | }; 5 | bool isLeapYear(int year) 6 | { 7 | return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); 8 | } 9 | int main() 10 | { 11 | int n; 12 | scanf("%d",&n); 13 | Date d; 14 | for(int i = 0;i < n;i++){ 15 | int dayOfMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 16 | scanf("%d%d%d",&d.year,&d.month,&d.day); 17 | if(isLeapYear(d.year)) 18 | dayOfMonth[2] += 1; 19 | d.day++; 20 | //printf("%d\n",d.day); 21 | //printf("%d\n",dayOfMonth[d.month]); 22 | if(d.day > dayOfMonth[d.month]){ 23 | d.month++; 24 | d.day = 1; 25 | } 26 | if(d.month > 12){ 27 | d.year++; 28 | d.month = 1; 29 | } 30 | printf("%04d-%02d-%02d\n",d.year,d.month,d.day); 31 | } 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /9.2二叉树的遍历/2014.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | struct node{ 6 | int data; 7 | node* lchild; 8 | node* rchild; 9 | }; 10 | 11 | char c[110]; 12 | int i; 13 | node* root = new node; 14 | 15 | node* create() 16 | { 17 | node* root = new node; 18 | if(c[i++] == '#') 19 | root = NULL; 20 | else{ 21 | root -> data = c[i - 1]; 22 | root -> lchild = create(); 23 | root -> rchild = create(); 24 | } 25 | return root; 26 | } 27 | void inOrder(node* root) 28 | { 29 | if(root == NULL){ 30 | return; 31 | } 32 | inOrder(root -> lchild); 33 | printf("%c ",root -> data); 34 | inOrder(root -> rchild); 35 | } 36 | int main() 37 | { 38 | while(scanf("%s",c) != EOF){ 39 | i = 0; 40 | root = create(); 41 | inOrder(root); 42 | cout << endl; 43 | } 44 | return 0; 45 | } 46 | -------------------------------------------------------------------------------- /11.2动态规划-最大连续子序列和/2086.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 10010; 5 | int a[maxn], dp[maxn]; 6 | int main() 7 | { 8 | int n; 9 | while (cin >> n, n) 10 | { 11 | for (int i = 0; i < n; i++) 12 | { 13 | cin >> a[i]; 14 | } 15 | dp[0] = a[0]; 16 | for (int i = 1; i < n; i++) 17 | dp[i] = max(a[i], dp[i - 1] + a[i]); 18 | int k = 0; 19 | for (int i = 1; i < n; i++) 20 | if (dp[i] > dp[k]) 21 | k = i; 22 | int sum = 0,k_ = k; 23 | while (sum < dp[k]) 24 | { 25 | sum += a[k_]; 26 | k_--; 27 | } 28 | if (dp[k] >= 0) 29 | cout << dp[k] << " " << a[k_+1] << " " << a[k] << endl; 30 | else 31 | { 32 | cout << "0 " << a[0] << " " << a[n - 1] << endl; 33 | } 34 | } 35 | return 0; 36 | } -------------------------------------------------------------------------------- /4.4贪心/1128.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int main() 5 | { 6 | int n; 7 | while(cin >> n && n != 0){ 8 | double result; 9 | if(n <= 4) 10 | result = 10; 11 | else if(n > 4 && n <= 8){ 12 | result = 10 + (n - 4) * 2; 13 | } 14 | else if(n > 8){ 15 | int rest = 0; 16 | if(n % 8 == 0){ 17 | result = (n/8) * 18; 18 | } 19 | else{ 20 | rest = n - (n/8)*8; 21 | if(rest <= 4){ 22 | result = rest * 2.4 + 18 * (n/8); 23 | } 24 | else 25 | result = 18 * (n/8) + 10 + (rest - 4) * 2; 26 | } 27 | } 28 | if(result == (int)result) 29 | printf("%d\n",(int)result); 30 | else 31 | printf("%.1f\n",result); 32 | } 33 | return 0; 34 | } 35 | -------------------------------------------------------------------------------- /11.8 动态规划总结/1911.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 50; 5 | int a_[maxn],a[maxn],dp[maxn]; 6 | int main() 7 | { 8 | int k; 9 | while(cin >> k && k != 0) 10 | { 11 | fill(a_,a + maxn,0); 12 | fill(a,a + maxn,0); 13 | for(int i = 1;i <= k;i++) 14 | cin >> a_[i]; 15 | int t = 1; 16 | for(int i = k;i >= 1;i--) 17 | { 18 | a[t] = a_[i]; 19 | t++; 20 | } 21 | int ans = -1; 22 | for(int i = 1;i <= k;i++) 23 | { 24 | dp[i] = 1; 25 | for(int j = 1;j < i;j++) 26 | { 27 | if(a[i] >= a[j] && dp[j] + 1 > dp[i]) 28 | { 29 | dp[i] = dp[j] + 1; 30 | } 31 | } 32 | ans = max(ans,dp[i]); 33 | } 34 | cout << ans << endl; 35 | } 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /3.4日期处理/2063.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | bool isLeapYear(int year) 3 | { 4 | return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; 5 | } 6 | int main() 7 | { 8 | int m; 9 | scanf("%d",&m); 10 | for(int i = 0;i < m;i++){ 11 | int dayOfMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 12 | int year,month,day,add; 13 | scanf("%d %d %d %d",&year,&month,&day,&add); 14 | for(int i = 0;i < add;i++){ 15 | if(isLeapYear(year)) 16 | dayOfMonth[2] = 29; 17 | else if(!isLeapYear(year)) 18 | dayOfMonth[2] = 28; 19 | day++; 20 | if(day > dayOfMonth[month]){ 21 | month++; 22 | day = 1; 23 | } 24 | if(month > 12){ 25 | year++; 26 | month = 1; 27 | } 28 | } 29 | printf("%04d-%02d-%02d\n",year,month,day); 30 | } 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /4.4贪心/5038.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int main() 4 | { 5 | int n; 6 | while(cin >> n){ 7 | int a[5]; 8 | a[0] = n / 50; 9 | a[1] = (n - a[0] * 50) / 20; 10 | a[2] = (n - a[0] * 50 - 20 * a[1]) / 10; 11 | a[3] = (n - a[0] * 50 - 20 * a[1] - a[2] * 10) / 5; 12 | a[4] = n - a[0] * 50 - a[1] * 20 - a[2] * 10 - a[3]*5; 13 | int count = 0;//calculate the number of "+" 14 | for(int i = 0;i < 5;i++){ 15 | if(a[i] != 0) 16 | count++; 17 | } 18 | int b[5] = {50,20,10,5,1}; 19 | for(int i = 0;i < 5;i++){ 20 | if(a[i] != 0){ 21 | if(count > 1){ 22 | cout << b[i] << "*" << a[i] << "+"; 23 | count--; 24 | } 25 | else 26 | cout << b[i] << "*" << a[i] << endl; 27 | } 28 | } 29 | } 30 | return 0; 31 | } 32 | -------------------------------------------------------------------------------- /2.8结构体/1310.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | struct student{ 3 | int num; 4 | char name[20]; 5 | int score1; 6 | int score2; 7 | int score3; 8 | int ave; 9 | }stu[100]; 10 | int main() 11 | { 12 | int i,j; 13 | float t1 = 0,t2 = 0,t3 = 0; 14 | int maxn = 0; 15 | for(i = 0;i < 10;i++){ 16 | scanf("%d %s %d %d %d",&stu[i].num,stu[i].name,&stu[i].score1,&stu[i].score2,&stu[i].score3); 17 | stu[i].ave = (stu[i].score1 + stu[i].score2 + stu[i].score3) / 3; 18 | if(stu[i].ave > maxn){ 19 | maxn = stu[i].ave; 20 | } 21 | t1 += stu[i].score1; 22 | t2 += stu[i].score2; 23 | t3 += stu[i].score3; 24 | } 25 | printf("%.2f %.2f %.2f\n",t1 / 10,t2 / 10,t3 / 10); 26 | for(int i = 0;i < 10;i++){ 27 | if(stu[i].ave == maxn){ 28 | printf("%d %s %d %d %d\n",stu[i].num,stu[i].name,stu[i].score1,stu[i].score2,stu[i].score3); 29 | } 30 | } 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /3.2查找元素/1935.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | struct s{ 4 | char number[100]; 5 | char name[200]; 6 | char sex[200]; 7 | int age; 8 | }stu[1010]; 9 | int main() 10 | { 11 | int n; 12 | while(scanf("%d",&n) != EOF){ 13 | for(int i = 0;i < n;i++){ 14 | scanf("%s %s %s %d\n",stu[i].number,stu[i].name,stu[i].sex,&stu[i].age); 15 | } 16 | int m; 17 | scanf("%d",&m); 18 | char num[1000]; 19 | for(int i = 0;i < m;i++){ 20 | scanf("%s",num); 21 | bool exist = false; 22 | for(int j = 0;j < n;j++){ 23 | if(strcmp(num,stu[j].number) == 0){ 24 | printf("%s %s %s %d\n",stu[j].number,stu[j].name,stu[j].sex,stu[j].age); 25 | exist = true; 26 | break; 27 | } 28 | } 29 | if(exist == false) 30 | printf("No Answer!\n"); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /9.7堆/26025.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | //小顶堆 8 | vector result_; 9 | int result; 10 | int n; 11 | while(cin >> n) 12 | { 13 | result_.clear(); 14 | result = 0; 15 | priority_queue,greater > heap; 16 | int temp1; 17 | for(int i = 0;i < n;i++) 18 | { 19 | cin >> temp1; 20 | heap.push(temp1); 21 | } 22 | while(heap.size() > 1){ 23 | int a = heap.top(); 24 | heap.pop(); 25 | int b = heap.top(); 26 | heap.pop(); 27 | int temp2 = a + b; 28 | result_.push_back(temp2); 29 | heap.push(temp2); 30 | } 31 | for(int i = 0;i < result_.size();i++) 32 | { 33 | result += result_[i]; 34 | } 35 | cout << result << endl; 36 | } 37 | return 0; 38 | } 39 | -------------------------------------------------------------------------------- /9.8哈夫曼树/1921.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | vector result_; 8 | int result; 9 | int n; 10 | while(cin >> n) 11 | { 12 | result_.clear(); 13 | result = 0; 14 | //小顶堆 15 | priority_queue,greater > heap; 16 | int temp1; 17 | for(int i = 0;i < n;i++) 18 | { 19 | cin >> temp1; 20 | heap.push(temp1); 21 | } 22 | while(heap.size() > 1){ 23 | int a = heap.top(); 24 | heap.pop(); 25 | int b = heap.top(); 26 | heap.pop(); 27 | int temp2 = a + b; 28 | result_.push_back(temp2); 29 | heap.push(temp2); 30 | } 31 | for(int i = 0;i < result_.size();i++) 32 | { 33 | result += result_[i]; 34 | } 35 | cout << result << endl; 36 | } 37 | return 0; 38 | } 39 | -------------------------------------------------------------------------------- /9.8哈夫曼树/5068.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | vector result_; 8 | int result; 9 | int n; 10 | while(cin >> n) 11 | { 12 | result_.clear(); 13 | result = 0; 14 | //小顶堆 15 | priority_queue,greater > heap; 16 | int temp1; 17 | for(int i = 0;i < n;i++) 18 | { 19 | cin >> temp1; 20 | heap.push(temp1); 21 | } 22 | while(heap.size() > 1){ 23 | int a = heap.top(); 24 | heap.pop(); 25 | int b = heap.top(); 26 | heap.pop(); 27 | int temp2 = a + b; 28 | result_.push_back(temp2); 29 | heap.push(temp2); 30 | } 31 | for(int i = 0;i < result_.size();i++) 32 | { 33 | result += result_[i]; 34 | } 35 | cout << result << endl; 36 | } 37 | return 0; 38 | } 39 | -------------------------------------------------------------------------------- /3.5进制转换/1942(2).cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 第二种方法是CSDN上看到的,可以说非常简洁了。 3 | 4 | 作者:子夜葵 5 | 来源:CSDN 6 | 原文:https://blog.csdn.net/lzyws739307453/article/details/79616525 7 | */ 8 | #include 9 | int main() 10 | { 11 | char a[100]; 12 | int i,j,s,m,n,d; 13 | while(scanf("%d %s %d",&m,a,&n) != EOF) 14 | { 15 | s = 0; 16 | for(i = 0;a[i];i++) 17 | { 18 | if(a[i] >= 'a' && a[i] <= 'f') 19 | a[i] -= 'a' - 10; 20 | else if(a[i] >= 'A' && a[i] <= 'F') 21 | a[i] -= 'A' - 10; 22 | else a[i] -= '0'; 23 | s = s * m + a[i]; 24 | } 25 | j = 0; 26 | while(s) 27 | { 28 | a[j++] = "0123456789ABCDEF"[s%n]; 29 | s /= n; 30 | } 31 | if(!j) 32 | printf("0"); 33 | else 34 | for(i = j - 1;i >= 0;i--) 35 | printf("%c",a[i]); 36 | printf("\n"); 37 | } 38 | return 0; 39 | } 40 | -------------------------------------------------------------------------------- /4.6two pointers/2932.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int maxn = 100010; 4 | int Partition(int a[],int left,int right) 5 | { 6 | int temp = a[left]; 7 | while(left < right){ 8 | while(left < right && a[right] > temp)right--; 9 | a[left] = a[right]; 10 | while(left < right && a[left] <= temp)left++; 11 | a[right] = a[left]; 12 | } 13 | a[left] = temp; 14 | return left; 15 | } 16 | void quick_sort(int a[],int left,int right) 17 | { 18 | if(left < right) 19 | { 20 | int pos = Partition(a,left,right); 21 | quick_sort(a,left,pos-1); 22 | quick_sort(a,pos+1,right); 23 | } 24 | } 25 | int main() 26 | { 27 | int n; 28 | while(cin >> n){ 29 | int a[maxn]; 30 | for(int i = 0;i < n;i++){ 31 | cin >> a[i]; 32 | } 33 | quick_sort(a,0,n-1); 34 | for(int i = 0;i < n;i++){ 35 | cout << a[i] << endl; 36 | } 37 | } 38 | return 0; 39 | } 40 | -------------------------------------------------------------------------------- /11.8 动态规划总结/2097.cpp: -------------------------------------------------------------------------------- 1 | //TK 题库答案 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | const int N = 35; 7 | const int M = 1005; 8 | 9 | struct Node { 10 | int happy, last, tail; 11 | bool operator < (const Node & b) const { 12 | return tail < b.tail; 13 | } 14 | }; 15 | Node a[N]; 16 | int dp[N][M]; 17 | int main() { 18 | int n; 19 | while (scanf("%d", &n) && n > 0) { 20 | for (int i = 0; i < n; ++i) 21 | scanf("%d %d %d", &a[i].happy, &a[i].last, &a[i].tail); 22 | sort(a, a + n); 23 | memset(dp, -1, sizeof(dp)); 24 | dp[0][0] = 0; 25 | for (int i = 0; i < n; ++i) { 26 | for (int j = 0; j < M; ++j) 27 | dp[i + 1][j] = dp[i][j]; 28 | for (int j = 0; j <= a[i].tail - a[i].last; ++j) 29 | if (dp[i][j] >= 0) 30 | dp[i + 1][j + a[i].last] = max(dp[i + 1][j + a[i].last], dp[i][j] + a[i].happy); 31 | } 32 | int ans = 0; 33 | for (int i = 0; i < M; ++i) 34 | ans = max(ans, dp[n][i]); 35 | printf("%d\n", ans); 36 | } 37 | return 0; 38 | } 39 | -------------------------------------------------------------------------------- /4.6two pointers/2843.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int Partition(int a[],int left,int right) 5 | { 6 | int temp = a[left]; 7 | while(left < right){ 8 | while(left < right && a[right] > temp) 9 | right--; 10 | a[left] = a[right]; 11 | while(left < right && a[left] <= temp) 12 | left++; 13 | a[right] = a[left]; 14 | } 15 | a[left] = temp; 16 | return left; 17 | } 18 | void quick_sort(int a[],int left,int right) 19 | { 20 | if(left < right) 21 | { 22 | int pos = Partition(a,left,right); 23 | quick_sort(a,left,pos-1); 24 | quick_sort(a,pos+1,right); 25 | } 26 | } 27 | int main() 28 | { 29 | int n; 30 | while(scanf("%d",&n) != EOF){ 31 | int a[5100]; 32 | for(int i = 0;i < n;i++){ 33 | cin >> a[i]; 34 | } 35 | quick_sort(a,0,n-1); 36 | for(int i = 0;i < n;i++){ 37 | cout << a[i] << endl; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /2.8结构体/1306.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | struct people1{ 3 | int num; 4 | char name[10]; 5 | char sex; 6 | char job; 7 | union { 8 | int class1; 9 | char position[10]; 10 | }category; 11 | }people[1000]; 12 | int main() 13 | { 14 | int n; 15 | scanf("%d",&n); 16 | for(int i = 0;i < n;i++){ 17 | scanf("%d %s %c %c",&people[i].num,people[i].name,&people[i].sex,&people[i].job); 18 | if(people[i].job == 's'){ 19 | scanf("%d",&people[i].category.class1); 20 | } 21 | else if(people[i].job == 't'){ 22 | scanf("%s",people[i].category.position); 23 | } 24 | } 25 | for(int i = 0;i < n;i++){ 26 | printf("%d %s %c %c ",people[i].num,people[i].name,people[i].sex,people[i].job); 27 | if(people[i].job == 's'){ 28 | printf("%d\n",people[i].category.class1); 29 | } 30 | else if(people[i].job == 't'){ 31 | printf("%s\n",people[i].category.position); 32 | } 33 | } 34 | return 0; 35 | } 36 | -------------------------------------------------------------------------------- /4.7其他技巧与算法/5067.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | int partation(int a[],int left,int right) 5 | { 6 | int temp = a[left]; 7 | while(left < right){ 8 | while(left < right && a[right] > temp)right--; 9 | a[left] = a[right]; 10 | while(left < right && a[left] < temp)left++; 11 | a[right] = a[left]; 12 | } 13 | a[left] = temp; 14 | return left; 15 | } 16 | int rand_select(int a[],int left,int right,int k) 17 | { 18 | if(left == right) 19 | return a[left]; 20 | int p = partation(a,left,right); 21 | int m = p - left + 1; 22 | if(k == m)return a[p]; 23 | if(k < m) 24 | return rand_select(a,left,p-1,k); 25 | else if(k > m) 26 | return rand_select(a,p+1,right,k-m); 27 | } 28 | int main() 29 | { 30 | long m,n; 31 | while(cin >> m >> n){ 32 | int a[101000]; 33 | for(long i = 0;i < m;i++) 34 | cin >> a[i]; 35 | cout << rand_select(a,0,m - 1,m-n+1) << endl; 36 | } 37 | return 0; 38 | } 39 | -------------------------------------------------------------------------------- /3.5进制转换/1943.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | char result[1000]; 4 | void divide_two(char n[]) 5 | { 6 | int j = -1,temp = 0; 7 | int test = 1; 8 | while(test){ 9 | test = 0; 10 | for(int i = 0;i < strlen(n);i++){ 11 | //计算商 12 | temp = (n[i] - '0') / 2; 13 | //被除数每一位都是0时,停止while循环 14 | test += temp; 15 | //如果是最后一位,就把这一位运算的余数装进结果数组中 16 | if(i == strlen(n) - 1) 17 | result[++j] = n[i] % 2 + '0'; 18 | //如果不是最后一位,计算下一位被除数 19 | else 20 | n[i + 1] += (n[i] - '0') % 2 * 10; 21 | //计算下一次for循环的除数 22 | n[i] = temp + '0'; 23 | } 24 | } 25 | } 26 | int main() 27 | { 28 | char n[50]; 29 | while(scanf("%s",n) != EOF){ 30 | memset(result,0,sizeof(result)); 31 | divide_two(n); 32 | int len = strlen(result); 33 | for(int i = len - 1;i >= 0;i--){ 34 | printf("%c",result[i]); 35 | } 36 | printf("\n"); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /8.1深度优先搜索DFS/5973.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | bool cal_next_num(int a[],int n,int r) 5 | { 6 | if(a[r - 1] < n){ 7 | a[r - 1]++; 8 | } 9 | else{ 10 | int i = 1; 11 | //计算第几位加1 12 | while(a[r - 1 - i] == n - i && (r - i) > 0){ 13 | i++; 14 | } 15 | if(r - i == 0)//r-i=0,r-i-1=-1,超出范围 16 | return false; 17 | a[r - i - 1]++; 18 | while(i > 0){ 19 | a[r - i] = a[r - i - 1] + 1; 20 | i--; 21 | } 22 | } 23 | return true; 24 | } 25 | int main() 26 | { 27 | int n,r; 28 | while(~scanf("%d %d",&n,&r)){ 29 | int a[30]; 30 | for(int i = 0;i < r;i++){ 31 | a[i] = i+1; 32 | printf("%d ",a[i]); 33 | } 34 | printf("\n"); 35 | while(cal_next_num(a,n,r)){ 36 | for(int i = 0;i < r;i++){ 37 | printf("%d ",a[i]); 38 | } 39 | printf("\n"); 40 | } 41 | } 42 | return 0; 43 | } 44 | -------------------------------------------------------------------------------- /6.1vector常见用法详解/6114.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | const int maxn = 26 * 26 * 26 * 10 + 1; 6 | int char2num(char s[]) 7 | { 8 | return (s[0] - 'A') * 26 * 26 * 10 + (s[1] - 'A') * 26 * 10 + (s[2] - 'A') * 10 + s[3] - '0'; 9 | } 10 | vector result[maxn]; 11 | int main() 12 | { 13 | int n,k; 14 | scanf("%d %d",&n,&k); 15 | int course_id,stu_num; 16 | for(int i = 0;i < k;i++){ 17 | scanf("%d %d",&course_id,&stu_num); 18 | char s[5]; 19 | for(int j = 0;j < stu_num;j++){ 20 | scanf("%s",s); 21 | int stu_name = char2num(s); 22 | result[stu_name].push_back(course_id); 23 | } 24 | } 25 | char line[5]; 26 | for(int i = 0;i < n;i++){ 27 | scanf("%s",line); 28 | printf("%s ",line); 29 | int line_ = char2num(line); 30 | printf("%d ",result[line_].size()); 31 | sort(result[line_].begin(),result[line_].end()); 32 | for(vector::iterator ib = result[line_].begin();ib != result[line_].end();ib++){ 33 | printf("%d ",*ib); 34 | } 35 | printf("\n"); 36 | } 37 | return 0; 38 | } -------------------------------------------------------------------------------- /4.4贪心/2134.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | typedef struct{ 6 | double j,f; 7 | double r; 8 | }change; 9 | bool cmp(change a,change b) 10 | { 11 | if(a.r == b.r) 12 | return a.j > b.j; 13 | return a.r > b.r; 14 | } 15 | int main() 16 | { 17 | double m; 18 | int n; 19 | while(cin >> m >> n && m != -1 && n != -1){ 20 | change c[1100]; 21 | for(int i = 0;i < n;i++){ 22 | cin >> c[i].j >> c[i].f; 23 | c[i].r = (double)(c[i].j / c[i].f);//calculate ratio 24 | } 25 | sort(c,c+n,cmp); 26 | double rest = 0; 27 | for(int i = 0;i < n;i++){ 28 | if(m >= c[i].f){ 29 | m -= c[i].f; 30 | rest += c[i].j; 31 | } 32 | else if(m > 0 && m < c[i].f){ 33 | rest += c[i].j / c[i].f * m; 34 | m = 0; 35 | } 36 | else 37 | break; 38 | } 39 | printf("%.3lf\n",rest); 40 | } 41 | } 42 | 43 | -------------------------------------------------------------------------------- /8.1深度优先搜索DFS/5976.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int arr[1000],countn = 0; 6 | bool flag[20]; 7 | int n; 8 | void DFS(int index) 9 | { 10 | if(index == n + 1){ 11 | for(int i = 1;i <= n;i++){ 12 | printf("%d ",arr[i]); 13 | } 14 | printf("\n"); 15 | countn++; 16 | return; 17 | } 18 | for(int i = 1;i <= n;i++){ 19 | if(!flag[i]){ 20 | bool judge = true; 21 | for(int j = 1;j < index;j++){ 22 | if(abs(index - j) == abs(i - arr[j])){ 23 | judge = false; 24 | break; 25 | } 26 | } 27 | if(judge){ 28 | arr[index] = i; 29 | flag[i] = true; 30 | DFS(index + 1); 31 | flag[i] = false; 32 | } 33 | } 34 | } 35 | } 36 | int main() 37 | { 38 | scanf("%d",&n); 39 | DFS(1); 40 | if(countn == 0){ 41 | printf("no solute!\n"); 42 | } 43 | return 0; 44 | } 45 | 46 | -------------------------------------------------------------------------------- /6.1vector常见用法详解/6117.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | int compare(char* name1,char* name2) 7 | { 8 | for(int i = 0;i < 4;i++){ 9 | if(name1[i] < name2[i]){ 10 | return 1; 11 | } 12 | else if(name1[i] == name2[i]){ 13 | continue; 14 | } 15 | else 16 | return 0; 17 | } 18 | } 19 | vector result[100000]; 20 | int main() 21 | { 22 | int n,k; 23 | scanf("%d %d",&n,&k); 24 | for(int i = 0;i < n;i++){ 25 | char* s = new char[5]; 26 | scanf("%s",s); 27 | int num; 28 | scanf("%d",&num); 29 | for(int j = 0;j < num;j++){ 30 | int course_id; 31 | scanf("%d",&course_id); 32 | result[course_id].push_back(s); 33 | } 34 | } 35 | for(int i = 1;i <= k;i++){ 36 | int size = result[i].size(); 37 | printf("%d %d\n", i,size); 38 | sort(result[i].begin(),result[i].end(),compare); 39 | for(vector::iterator ib = result[i].begin();ib != result[i].end();ib++){ 40 | printf("%s\n",*ib); 41 | } 42 | } 43 | return 0; 44 | } 45 | -------------------------------------------------------------------------------- /10.3图的遍历/1798.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 1000010; 5 | vector adj[maxn]; 6 | int n = 0; 7 | int result = 0; 8 | bool vis[maxn] = {false}; 9 | //判断这个节点是否存在 10 | bool is_exist[maxn] = {false}; 11 | void dfs(int u,int depth) 12 | { 13 | vis[u] = true; 14 | for(int i = 0;i < adj[u].size();i++) 15 | { 16 | int v = adj[u][i]; 17 | if(vis[v] == false) 18 | { 19 | dfs(v,depth + 1); 20 | } 21 | } 22 | } 23 | void dfs_traver() 24 | { 25 | for(int u = 0;u <= n;u++) 26 | { 27 | //节点u存在并且未被访问 28 | if(vis[u] == false && is_exist[u]) 29 | { 30 | dfs(u,1); 31 | result++; 32 | } 33 | } 34 | cout << result << endl; 35 | } 36 | int main() 37 | { 38 | int a,b; 39 | while(cin >> a >> b) 40 | { 41 | if(a > n) n = a; 42 | if(b > n) n = b; 43 | adj[a].push_back(b); 44 | adj[b].push_back(a); 45 | is_exist[a] = true; 46 | is_exist[b] = true; 47 | } 48 | dfs_traver(); 49 | return 0; 50 | } 51 | -------------------------------------------------------------------------------- /5.6大整数运算/1949.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct bign { 5 | int d[1100]; 6 | int len; 7 | bign() { 8 | memset(d,0,sizeof(d)); 9 | len = 0; 10 | } 11 | }; 12 | bign change(char str[]) 13 | { 14 | bign a; 15 | a.len = strlen(str); 16 | for(int i = 0;i < a.len;i++){ 17 | a.d[i] = str[a.len - i - 1] - '0'; 18 | } 19 | return a; 20 | } 21 | bign add(bign a,bign b) 22 | { 23 | bign c; 24 | int carry = 0; 25 | for(int i = 0;i < a.len || i < b.len;i++){ 26 | int temp = a.d[i] + b.d[i] + carry; 27 | c.d[c.len++] = temp % 10; 28 | carry = temp / 10; 29 | } 30 | if(carry != 0) 31 | c.d[c.len++] = carry; 32 | return c; 33 | } 34 | void print(bign a) 35 | { 36 | for(int i = a.len - 1;i >= 0;i--){ 37 | cout << a.d[i]; 38 | } 39 | } 40 | int main() 41 | { 42 | char str1[1100],str2[1100]; 43 | while(cin >> str1 >> str2){ 44 | bign a = change(str1); 45 | bign b = change(str2); 46 | print(add(a,b)); 47 | cout << endl; 48 | } 49 | return 0; 50 | } 51 | -------------------------------------------------------------------------------- /4.3递归/2018.c: -------------------------------------------------------------------------------- 1 | #include 2 | //用得迭代,效率更高一点。 3 | int fibonacci(int n) 4 | { 5 | int result = 0; 6 | if(n == 1) 7 | result = 1; 8 | else if(n == 2){ 9 | result = 1; 10 | } 11 | else{ 12 | int f1 = 1,f2 = 1,f3 = 0; 13 | for(int i = 0;i < n - 2;i++){ 14 | f3 = f1 + f2; 15 | f1 = f2; 16 | f2 = f3; 17 | } 18 | result = f3; 19 | } 20 | return result; 21 | } 22 | int main() 23 | { 24 | int n; 25 | scanf("%d",&n); 26 | while(n--){ 27 | int m; 28 | scanf("%d",&m); 29 | for(int i = 0;i < m - 1;i++){ 30 | printf(" "); 31 | } 32 | printf("0\n"); 33 | //这种图形输出注意空格就可以。 34 | for(int i = 1;i < m;i++){ 35 | for(int j = 0;j < m - 1 - i;j++){ 36 | printf(" "); 37 | } 38 | printf("0 "); 39 | for(int j = 1;j <= 2 * i - 1;j++){ 40 | printf("%d ",fibonacci(j)); 41 | } 42 | printf("%d",fibonacci(2 * i)); 43 | printf("\n"); 44 | } 45 | } 46 | return 0; 47 | } 48 | -------------------------------------------------------------------------------- /7.3链表/2421.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | struct node{ 3 | int data; 4 | node* next; 5 | }; 6 | //尾插法 7 | node* create(int n) 8 | { 9 | node *head,*p,*end; 10 | head = new node; 11 | end = new node; 12 | head -> next = NULL; 13 | end = head; 14 | for(int i = 0;i < n;i++){ 15 | p = new node; 16 | scanf("%d",&(p -> data)); 17 | end -> next = p; 18 | end = p; 19 | } 20 | //最后一位要指向空 21 | end -> next = NULL; 22 | return head; 23 | } 24 | void show(node* head) 25 | { 26 | node* p = head; 27 | p = p -> next; 28 | while(p != NULL){ 29 | printf("%d ",p -> data); 30 | p = p -> next; 31 | } 32 | } 33 | void merge(node* head1,node* head2) 34 | { 35 | node *p1,*p2; 36 | p1 = head1 -> next; 37 | p2 = head2 -> next; 38 | while(p1 -> next != NULL){ 39 | p1 = p1 -> next; 40 | } 41 | p1 -> next = head2 -> next; 42 | 43 | } 44 | int main() 45 | { 46 | int m,n; 47 | scanf("%d",&m); 48 | node* L1 = create(m); 49 | scanf("%d",&n); 50 | node* L2 = create(n); 51 | merge(L1,L2); 52 | show(L1); 53 | return 0; 54 | } 55 | -------------------------------------------------------------------------------- /4.1排序/2069.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | /** 5 | 题目描述 6 | 中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数). 7 | 给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数) 8 | 9 | 输入 10 | 该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据包含的数据个数,1<=N<=10000. 11 | 接着N行为N个数据的输入,N=0时结束输入 12 | 13 | 输出 14 | 输出中位数,每一组测试数据输出一行 15 | 16 | 样例输入 17 | 1 18 | 468 19 | 15 20 | 501 21 | 170 22 | 725 23 | 479 24 | 359 25 | 963 26 | 465 27 | 706 28 | 146 29 | 282 30 | 828 31 | 962 32 | 492 33 | 996 34 | 943 35 | 0 36 | 样例输出 37 | 468 38 | 501 39 | **/ 40 | bool cmp(int a,int b) 41 | { 42 | return a > b; 43 | } 44 | int main() 45 | { 46 | int n; 47 | while(cin >> n && n != 0){ 48 | int a[11000],result; 49 | for(int i = 0;i < n;i++) 50 | { 51 | cin >> a[i]; 52 | } 53 | sort(a,a+n,cmp); 54 | if(n == 1){ 55 | result = a[0]; 56 | } 57 | else if(n % 2 == 0) 58 | { 59 | result = (a[(n+1)/2] + a[(n-1)/2]) / 2; 60 | } 61 | else if(n % 2 != 0) 62 | { 63 | result = a[n / 2]; 64 | } 65 | cout << result << endl; 66 | } 67 | return 0; 68 | } 69 | -------------------------------------------------------------------------------- /4.5二分/1937.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int a[110],b[110]; 6 | int bin_search(int a[],int n,int b) 7 | { 8 | int left = 0,right = n,mid; 9 | while(left <= right){ 10 | mid = left + (right - left) / 2; 11 | if(a[mid] == b){ 12 | return mid; 13 | } 14 | else if(a[mid] > b){ 15 | right = mid - 1; 16 | }else if(a[mid] < b){ 17 | left = mid + 1; 18 | } 19 | } 20 | return -1; 21 | } 22 | bool cmp(int a,int b) 23 | { 24 | return a < b; 25 | } 26 | int main() 27 | { 28 | int n; 29 | while(scanf("%d",&n) != EOF){ 30 | for(int i = 0;i < n;i++){ 31 | scanf("%d",&a[i]); 32 | } 33 | 34 | int m; 35 | scanf("%d",&m); 36 | sort(a,a+n,cmp); 37 | for(int i = 0;i < m;i++){ 38 | scanf("%d",&b[i]); 39 | } 40 | 41 | for(int i = 0;i < m;i++){ 42 | int index = bin_search(a,n,b[i]); 43 | if(index != -1) 44 | printf("YES\n"); 45 | else 46 | printf("NO\n"); 47 | } 48 | } 49 | return 0; 50 | } 51 | -------------------------------------------------------------------------------- /3.6字符串处理/1808.cpp: -------------------------------------------------------------------------------- 1 | /** 2 | 作者:Sober__ 3 | 来源:CSDN 4 | 原文:https://blog.csdn.net/Joah_Ge/article/details/80630309 5 | 6 | 思路:写一个compare函数,用来比较s的第i个位置开始后面是否有和s1相同的字符串, 7 | 如果有的话,将那些字符赋值为’?’,然后对i从0遍历。最后输出非问号和空格的字符 8 | 9 | **/ 10 | #include 11 | #include 12 | int compare(char s1[],char s[],int i){ 13 | int j; 14 | for (j = 0; j < strlen(s1); j++) { 15 | if (s1[j] >= 'A'&&s1[j] <= 'Z') s1[j] = s1[j] + 32; //不区分大小写,先把大写转换为小写 16 | if (!(s[i + j] == s1[j] || s[i + j] == s1[j] - 32)) { //相等或者等于相应的大写字母,不相等则返回零 17 | return 0; 18 | } 19 | } 20 | for (j = 0; j < strlen(s1); j++) { //如果存在相同的部分,赋值为'?' 21 | s[i + j] = '?'; 22 | } 23 | return 1; 24 | } 25 | int main() { 26 | char s1[100]; 27 | char s[10010]; 28 | scanf("%s", s1); 29 | getchar(); 30 | while (gets(s)) { 31 | int i = 0; 32 | while(s[i]!='\0'){ 33 | if (compare(s1, s, i)) i += strlen(s1); //如果存在,跳strlen(s1) 34 | else i++; //不存在,跳1 35 | } 36 | for (i = 0; s[i] != '\0'; i++) { 37 | if (s[i] != '?'&&s[i] != ' ') putchar(s[i]); 38 | } 39 | printf("\n"); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /4.1排序/2043.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | /** 6 | 题目描述 7 | N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量, 8 | 要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色。 9 | 帽子的颜色用“red”,“blue”等字符串来表示。不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。 10 | 11 | 输入 12 | 多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目。 13 | 下面有N行,每行是一只白鼠的信息。第一个为不大于100的正整数,表示白鼠的重量, 14 | 第二个为字符串,表示白鼠的帽子颜色,字符串长度不超过10个字符。 15 | 注意:白鼠的重量各不相同。 16 | 17 | 输出 18 | 每个案例按照白鼠的重量从大到小的顺序输出白鼠的帽子颜色 19 | 20 | 样例输入 21 | 1 22 | 79 omi 23 | 9 24 | 46 lcg 25 | 92 cru 26 | 37 ceq 27 | 54 vhr 28 | 17 wus 29 | 27 tnv 30 | 13 kyr 31 | 95 wld 32 | 34 qox 33 | 34 | 样例输出 35 | omi 36 | wld 37 | cru 38 | vhr 39 | lcg 40 | ceq 41 | qox 42 | tnv 43 | wus 44 | kyr 45 | **/ 46 | typedef struct{ 47 | int num; 48 | char color[11]; 49 | }mouse; 50 | bool cmp(mouse a,mouse b) 51 | { 52 | return a.num > b.num; 53 | } 54 | int main() 55 | { 56 | int n; 57 | while(cin >> n){ 58 | mouse m[110]; 59 | for(int i = 0;i < n;i++){ 60 | cin >> m[i].num >> m[i].color; 61 | } 62 | sort(m,m+n,cmp); 63 | for(int i = 0;i < n;i++){ 64 | cout << m[i].color << endl; 65 | } 66 | } 67 | return 0; 68 | } 69 | -------------------------------------------------------------------------------- /4.4贪心/1126.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 题目描述 3 | 暑假到了,小明终于可以开心的看电视了。但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目。 4 | 现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗? 5 | 输入 6 | 输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。 7 | 接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。 8 | 当n=0时,输入结束。 9 | 输出 10 | 对于每组输入,输出能完整看到的电视节目的个数 11 | 样例输入 12 | 12 13 | 1 3 14 | 3 4 15 | 0 7 16 | 3 8 17 | 15 19 18 | 15 20 19 | 10 15 20 | 8 18 21 | 6 12 22 | 5 10 23 | 4 14 24 | 2 9 25 | 0 26 | 样例输出 27 | 5 28 | */ 29 | #include 30 | #include 31 | #include 32 | using namespace std; 33 | typedef struct{ 34 | int si; 35 | int ei; 36 | }Time; 37 | bool cmp(Time t1,Time t2) 38 | { 39 | return t1.ei < t2.ei; 40 | } 41 | int main() 42 | { 43 | Time time[100]; 44 | int n; 45 | while(cin >> n && n != 0){ 46 | for(int i = 0;i < n;i++){ 47 | cin >> time[i].si >> time[i].ei; 48 | } 49 | sort(time,time+n,cmp); 50 | int temp = time[0].ei; 51 | int sum = 1; 52 | for(int i = 1;i < n;i++){ 53 | if(temp <= time[i].si){ 54 | sum++; 55 | temp = time[i].ei; 56 | } 57 | } 58 | cout << sum << endl; 59 | } 60 | return 0; 61 | } 62 | -------------------------------------------------------------------------------- /10.4最短路径/1769.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 60; 5 | const int inf = 0x3fffffff; 6 | int n; 7 | int dis[maxn][maxn]; 8 | void floyd() 9 | { 10 | for(int k = 0;k < n;k++) 11 | { 12 | for(int i = 0;i < n;i++) 13 | { 14 | for(int j = 0;j < n;j++) 15 | { 16 | if(dis[i][k] != 0 && dis[k][j] != 0 && dis[i][k] + dis[k][j] < dis[i][j]) 17 | { 18 | dis[i][j] = dis[i][k] + dis[k][j]; 19 | } 20 | } 21 | } 22 | } 23 | } 24 | int main() 25 | { 26 | cin >> n; 27 | for(int i = 0;i < n;i++) 28 | { 29 | for(int j = 0;j < n;j++) 30 | { 31 | cin >> dis[i][j]; 32 | if(dis[i][j] == 0 && i != j) 33 | { 34 | dis[i][j] = inf; 35 | } 36 | } 37 | } 38 | floyd(); 39 | for(int i = 0;i < n;i++) 40 | { 41 | for(int j = 0;j < n;j++) 42 | { 43 | if(dis[i][j] == inf) 44 | cout << "-1" << " "; 45 | else 46 | cout << dis[i][j] << " "; 47 | } 48 | cout << endl; 49 | } 50 | return 0; 51 | } 52 | -------------------------------------------------------------------------------- /11.5最长回文子串/22562.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #define MAXN 5001 + 10 5 | using namespace std; 6 | char buf[MAXN], s[MAXN]; 7 | int p[MAXN]; 8 | int main() { 9 | int n, m = 0, max = 0, x = 0, y = 0; 10 | int i, j; 11 | fgets(buf, sizeof(s), stdin); 12 | n = strlen(buf); 13 | for (i = 0; i < n; i = i + 1) 14 | if (isalpha(buf[i])) 15 | { 16 | p[m] = i; 17 | s[m++] = toupper(buf[i]); 18 | } 19 | for (i = 0; i < m; ++i) { 20 | for (j = 0; i - j >= 0 && i + j < m; j = j + 1) 21 | { 22 | if (s[i - j] != s[i + j]) 23 | break; 24 | if (j * 2 + 1 > max) 25 | { 26 | max = j * 2 + 1; x = p[i - j]; y = p[i + j]; 27 | } 28 | } 29 | for (j = 0; i - j >= 0 && i - j + 1 < m; j++) 30 | { 31 | if (s[i - j] != s[i + j + 1]) 32 | break; 33 | if (j * 2 + 2 > max) 34 | { 35 | max = j * 2 + 2; x = p[i - j]; y = p[i + j + 1]; 36 | } 37 | } 38 | } 39 | for (i = x; i <= y; ++i) 40 | printf("%c", buf[i]); 41 | printf("\n"); 42 | return 0; 43 | } -------------------------------------------------------------------------------- /11.6DAG最长路/21773.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 版权声明:本文为CSDN博主「晨子衿」的原创文章,遵循 CC 4.0 BY - SA 版权协议,转载请附上原文出处链接及本声明。 3 | 原文链接:https ://blog.csdn.net/qq_36502291/article/details/88875468 4 | */ 5 | #include 6 | #include 7 | #include 8 | using namespace std; 9 | const int INF = 1e9; 10 | struct Node { 11 | int a, b; 12 | Node(int x, int y) : a(x), b(y) {} 13 | }; 14 | int dp[1050], n; 15 | vector G; 16 | 17 | int DP(int i) { 18 | if (dp[i] > 0) return dp[i]; 19 | for (int j = 0; j < n; j++) { 20 | if (G[i].a > G[j].a&&G[i].b > G[j].b) { 21 | dp[i] = max(dp[i], DP(j) + 1); 22 | } 23 | } 24 | return dp[i]; 25 | } 26 | 27 | int main() { 28 | int N; 29 | cin >> N; 30 | while (N--) { 31 | cin >> n; 32 | fill(dp, dp + n, 0);//勿忘初始化 33 | G.clear(); 34 | for (int i = 0; i < n; i++) { 35 | int x, y; 36 | cin >> x >> y; 37 | if (x < y) swap(x, y); 38 | G.push_back(Node(x, y)); 39 | } 40 | int len = -INF; 41 | for (int i = 0; i < n; i++) { 42 | dp[i] = DP(i); 43 | len = max(len, dp[i]); 44 | } 45 | cout << len + 1 << endl; 46 | } 47 | return 0; 48 | } 49 | -------------------------------------------------------------------------------- /5.6大整数运算/1917.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct bign{ 5 | int a[3000]; 6 | int len; 7 | bign() { 8 | memset(a,0,sizeof(a)); 9 | len = 0; 10 | } 11 | }; 12 | bign multi(bign a,int b) 13 | { 14 | bign c; 15 | int carry = 0; 16 | for(int i = 0;i < a.len;i++){ 17 | int temp = a.a[i] * b + carry; 18 | c.a[c.len++] = temp % 10; 19 | carry = temp / 10; 20 | } 21 | while(carry != 0){ 22 | c.a[c.len++] = carry % 10; 23 | carry /= 10; 24 | } 25 | return c; 26 | } 27 | bign change(int x) 28 | { 29 | bign a; 30 | while(x){ 31 | a.a[a.len++] = x % 10; 32 | x /= 10; 33 | } 34 | return a; 35 | } 36 | void print(bign a) 37 | { 38 | for(int i = a.len - 1;i >= 0;i--){ 39 | cout << a.a[i]; 40 | } 41 | } 42 | int main() 43 | { 44 | int n; 45 | while(cin >> n){ 46 | if(n != 0){ 47 | bign result = change(n); 48 | for(int i = 1;i < n;i++){ 49 | result = multi(result,i); 50 | } 51 | print(result); 52 | cout << endl; 53 | } 54 | else 55 | cout << "1" << endl; 56 | } 57 | return 0; 58 | } 59 | -------------------------------------------------------------------------------- /13.2树状数组/1098.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int maxn = 500010; 4 | int a[maxn]; 5 | long long num; 6 | void merge(int a[],int L1,int R1,int L2,int R2) 7 | { 8 | int i = L1,j = L2; 9 | int temp[maxn],index = 0; 10 | while(i <= R1 && j <= R2) 11 | { 12 | if(a[i] <= a[j]) 13 | { 14 | temp[index++] = a[i++]; 15 | } 16 | else 17 | { 18 | num += (R1 - i + 1); 19 | temp[index++] = a[j++]; 20 | } 21 | } 22 | while(i <= R1) 23 | temp[index++] = a[i++]; 24 | while(j <= R2) 25 | temp[index++] = a[j++]; 26 | for(int i = 0;i < index;i++) 27 | { 28 | a[L1 + i] = temp[i]; 29 | } 30 | } 31 | void merge_sort(int a[],int left,int right) 32 | { 33 | if(left < right) 34 | { 35 | int mid = (left + right) / 2; 36 | merge_sort(a,left,mid); 37 | merge_sort(a,mid + 1,right); 38 | merge(a,left,mid,mid+1,right); 39 | } 40 | } 41 | int main() 42 | { 43 | int n; 44 | while(cin >> n && n != 0) 45 | { 46 | num = 0; 47 | fill(a,a+maxn,0); 48 | for(int i = 0;i < n;i++) 49 | { 50 | cin >> a[i]; 51 | } 52 | merge_sort(a,0,n-1); 53 | cout << num << endl; 54 | } 55 | return 0; 56 | } 57 | -------------------------------------------------------------------------------- /4.6two pointers/3105.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int maxn = 101000; 4 | void merge(int a[],int low1,int high1,int low2,int high2) 5 | { 6 | 7 | int i = low1,j = low2,k = 0; 8 | int temp[maxn]; 9 | while(i <= high1 && j <= high2){ 10 | if(a[i] <= a[j]) 11 | temp[k++] = a[i++]; 12 | if(a[i] > a[j]) 13 | temp[k++] = a[j++]; 14 | } 15 | //only run one of two following sentences 16 | while(i <= high1) 17 | temp[k++] = a[i++]; 18 | while(j <= high2) 19 | temp[k++] = a[j++]; 20 | for(i = 0;i < k;i++){ 21 | a[low1 + i] = temp[i]; 22 | } 23 | } 24 | void merge_sort(int a[],int low,int high) 25 | { 26 | if(low < high){ 27 | int mid = (low + high) / 2; 28 | 29 | merge_sort(a,low,mid); 30 | merge_sort(a,mid+1,high); 31 | merge(a,low,mid,mid+1,high); 32 | } 33 | } 34 | int main() 35 | { 36 | int n; 37 | cin >> n; 38 | while(n--){ 39 | int number,m,k = 0; 40 | cin >> m; 41 | int a[maxn]; 42 | 43 | for(int i = 0;i < m;i++){ 44 | cin >> number; 45 | a[k++] = number; 46 | } 47 | 48 | merge_sort(a,0,m-1); 49 | for(int i = 0;i < m;i++){ 50 | cout << a[i] << endl; 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /9.6并查集/1953.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int N = 1100; 4 | int father[N]; 5 | bool is_root[N]; 6 | int find_father(int x) 7 | { 8 | int a = x; 9 | while (x != father[x]) 10 | { 11 | x = father[x]; 12 | } 13 | while (a != father[a]) 14 | { 15 | int z = a; 16 | a = father[a]; 17 | father[z] = x; 18 | } 19 | return x; 20 | } 21 | void union_(int a, int b) 22 | { 23 | int fa_a = find_father(a); 24 | int fa_b = find_father(b); 25 | if (fa_a != fa_b) 26 | { 27 | father[fa_a] = fa_b; 28 | } 29 | } 30 | void init(int n) 31 | { 32 | for (int i = 1; i <= n; i++) 33 | { 34 | father[i] = i; 35 | is_root[i] = false; 36 | } 37 | } 38 | int main() 39 | { 40 | int m, n,a,b; 41 | while (cin >> n && n != 0) 42 | { 43 | cin >> m; 44 | init(n); 45 | for (int i = 0; i < m; i++) 46 | { 47 | cin >> a >> b; 48 | union_(a, b); 49 | } 50 | for (int i = 1; i <= n; i++) 51 | { 52 | is_root[find_father(i)] = true; 53 | } 54 | int ans = 0; 55 | for (int i = 1; i <= n; i++) 56 | { 57 | ans += is_root[i]; 58 | } 59 | cout << ans - 1 << endl; 60 | } 61 | return 0; 62 | } -------------------------------------------------------------------------------- /9.7堆/1779.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 100010; 5 | int heap[maxn],n; 6 | //向下调整 7 | void down_adjust(int low, int high) 8 | { 9 | int i = low, j = i * 2; 10 | while (j <= high) 11 | { 12 | if (j + 1 <= high && heap[j + 1] > heap[j]) 13 | { 14 | j = j + 1; 15 | } 16 | if (heap[j] > heap[i]) 17 | { 18 | swap(heap[j], heap[i]); 19 | i = j; 20 | j = i * 2; 21 | } 22 | else 23 | { 24 | break; 25 | } 26 | } 27 | } 28 | //创建堆 29 | void create_heap() 30 | { 31 | for (int i = n / 2; i >= 1; i--) 32 | { 33 | down_adjust(i, n); 34 | } 35 | } 36 | void heap_sort() 37 | { 38 | create_heap(); 39 | for (int i = n; i > 1; i--) 40 | { 41 | swap(heap[i], heap[1]); 42 | down_adjust(1, i - 1); 43 | } 44 | } 45 | int main() 46 | { 47 | while (cin >> n) 48 | { 49 | int data; 50 | for (int i = 1; i <= n; i++) 51 | { 52 | cin >> data; 53 | heap[i] = data; 54 | } 55 | heap_sort(); 56 | for (int i = 1; i <= n; i++) 57 | { 58 | cout << heap[i] << " "; 59 | } 60 | cout << endl; 61 | } 62 | return 0; 63 | } 64 | -------------------------------------------------------------------------------- /11.8 动态规划总结/2058.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int maxn = 110; 4 | int a[maxn][maxn]; 5 | int dp[maxn]; 6 | int main() 7 | { 8 | int n; 9 | while(cin >> n) 10 | { 11 | fill(a[0],a[0] + maxn*maxn,0); 12 | fill(dp,dp + maxn,0); 13 | int c[n + 10],result = 0; 14 | for(int i = 0;i < n;i++) 15 | { 16 | for(int j = 0;j < n;j++) 17 | { 18 | cin >> a[i][j]; 19 | } 20 | } 21 | //res有可能小于0 22 | int res = a[0][0]; 23 | for(int i = 0;i < n;i++) 24 | { 25 | fill(c,c + n,0); 26 | for(int j = i;j < n;j++) 27 | { 28 | for(int k = 0;k < n;k++) 29 | { 30 | c[k] += a[j][k]; 31 | } 32 | dp[0] = c[0]; 33 | for(int l = 1;l < n;l++) 34 | { 35 | dp[l] = max(c[l],dp[l - 1] + c[l]); 36 | } 37 | for(int l = 1;l < n;l++) 38 | { 39 | if(dp[l] > dp[result]) 40 | result = l; 41 | } 42 | if(dp[result] > res) 43 | res = dp[result]; 44 | } 45 | } 46 | cout << res << endl; 47 | } 48 | return 0; 49 | } 50 | -------------------------------------------------------------------------------- /7.3链表/1870.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | struct node{ 4 | int id; 5 | int grade; 6 | node* next; 7 | }; 8 | node* create(int n) 9 | { 10 | node *p,*head; 11 | head = new node; 12 | head -> next = NULL; 13 | for(int i = 0;i < n;i++){ 14 | p = new node; 15 | scanf("%d %d",&(p -> id),&(p -> grade)); 16 | p -> next = head -> next; 17 | head -> next = p; 18 | } 19 | return head; 20 | } 21 | void merge(node* head) 22 | { 23 | node *p,*q; 24 | for(p = head -> next;p -> next != NULL;p = p -> next){ 25 | for(q = p -> next;q != NULL;q = q -> next){ 26 | if(q -> id < p -> id){ 27 | int temp1 = q -> id; 28 | q -> id = p -> id; 29 | p -> id = temp1; 30 | int temp2 = q -> grade; 31 | q -> grade = p -> grade; 32 | p -> grade = temp2; 33 | } 34 | } 35 | } 36 | } 37 | void show(node* head) 38 | { 39 | node*p = head; 40 | p = p -> next; 41 | while(p != NULL){ 42 | printf("%d %d\n",p -> id,p -> grade); 43 | p = p -> next; 44 | } 45 | } 46 | int main() 47 | { 48 | int n,m; 49 | while(scanf("%d %d",&n,&m) != EOF){ 50 | node* L = create(n+m); 51 | merge(L); 52 | show(L); 53 | } 54 | return 0; 55 | } 56 | -------------------------------------------------------------------------------- /9.6并查集/2128.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int N = 1100; 4 | int father[N]; 5 | bool is_root[N]; 6 | int find_father(int x) 7 | { 8 | int a = x; 9 | while (x != father[x]) 10 | { 11 | x = father[x]; 12 | } 13 | while (a != father[a]) 14 | { 15 | int z = a; 16 | a = father[a]; 17 | father[z] = x; 18 | } 19 | return x; 20 | } 21 | void union_(int a, int b) 22 | { 23 | int fa_a = find_father(a); 24 | int fa_b = find_father(b); 25 | if (fa_a != fa_b) 26 | { 27 | father[fa_a] = fa_b; 28 | } 29 | } 30 | void init(int n) 31 | { 32 | for (int i = 1; i <= n; i++) 33 | { 34 | father[i] = i; 35 | is_root[i] = false; 36 | } 37 | } 38 | int main() 39 | { 40 | int t; 41 | cin >> t; 42 | while (t--) 43 | { 44 | int m, n, a, b; 45 | cin >> n >> m; 46 | init(n); 47 | for (int i = 0; i < m; i++) 48 | { 49 | cin >> a >> b; 50 | union_(a, b); 51 | } 52 | for (int i = 1; i <= n; i++) 53 | { 54 | is_root[find_father(i)] = true; 55 | } 56 | int ans = 0; 57 | for (int i = 1; i <= n; i++) 58 | { 59 | ans += is_root[i]; 60 | } 61 | cout << ans << endl; 62 | } 63 | return 0; 64 | } 65 | -------------------------------------------------------------------------------- /9.2二叉树的遍历/1096.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | const int maxn = 50; 7 | struct node{ 8 | int data; 9 | node* lchild; 10 | node* rchild; 11 | }; 12 | char pre[maxn],in[maxn],post[maxn]; 13 | 14 | node* create(int preL,int preR,int inL,int inR) 15 | { 16 | if(preL > preR){ 17 | return NULL; 18 | } 19 | 20 | node* root = new node; 21 | root -> data = pre[preL]; 22 | int k; 23 | for(k = inL;k <= inR;k++){ 24 | if(in[k] == pre[preL]){ 25 | break; 26 | } 27 | } 28 | int numLeft = k - inL; 29 | 30 | root -> lchild = create(preL + 1,preL + numLeft,inL,k - 1); 31 | root -> rchild = create(preL + numLeft + 1,preR,k + 1,inR); 32 | 33 | return root; 34 | } 35 | 36 | void postOrder(node* root) 37 | { 38 | if(root == NULL) 39 | return; 40 | postOrder(root->lchild); 41 | postOrder(root->rchild); 42 | printf("%c",root->data); 43 | } 44 | int main() 45 | { 46 | while(scanf("%s",pre) != EOF){ 47 | scanf("%s",in); 48 | int len1 = strlen(pre); 49 | int len2 = strlen(in); 50 | //cout << len1 << "--------" << len2 << endl; 51 | node* root = create(0,len1 - 1,0,len2 - 1); 52 | postOrder(root); 53 | printf("\n"); 54 | } 55 | return 0; 56 | } 57 | -------------------------------------------------------------------------------- /9.2二叉树的遍历/1910.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | const int maxn = 50; 7 | struct node{ 8 | int data; 9 | node* lchild; 10 | node* rchild; 11 | }; 12 | char pre[maxn],in[maxn],post[maxn]; 13 | 14 | node* create(int preL,int preR,int inL,int inR) 15 | { 16 | if(preL > preR){ 17 | return NULL; 18 | } 19 | 20 | node* root = new node; 21 | root -> data = pre[preL]; 22 | int k; 23 | for(k = inL;k <= inR;k++){ 24 | if(in[k] == pre[preL]){ 25 | break; 26 | } 27 | } 28 | int numLeft = k - inL; 29 | 30 | root -> lchild = create(preL + 1,preL + numLeft,inL,k - 1); 31 | root -> rchild = create(preL + numLeft + 1,preR,k + 1,inR); 32 | 33 | return root; 34 | } 35 | 36 | void postOrder(node* root) 37 | { 38 | if(root == NULL) 39 | return; 40 | postOrder(root->lchild); 41 | postOrder(root->rchild); 42 | printf("%c",root->data); 43 | } 44 | int main() 45 | { 46 | while(scanf("%s",pre) != EOF){ 47 | scanf("%s",in); 48 | int len1 = strlen(pre); 49 | int len2 = strlen(in); 50 | //cout << len1 << "--------" << len2 << endl; 51 | node* root = create(0,len1 - 1,0,len2 - 1); 52 | postOrder(root); 53 | printf("\n"); 54 | } 55 | return 0; 56 | } 57 | -------------------------------------------------------------------------------- /6.4map用法详解/6168.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | using namespace std; 7 | int main() 8 | { 9 | string s; 10 | getline(cin,s); 11 | for(int i = 0;i < s.length();i++){ 12 | if(s[i] >= 'A' && s[i] <= 'Z'){ 13 | s[i] = s[i] - 'A' + 'a'; 14 | } 15 | } 16 | map s_map; 17 | int j = 0;//j表示第二次从几开始循环 18 | while(j < s.length()){ 19 | int i; 20 | string temp = ""; 21 | for(i = j;i < s.length();i++){ 22 | if((s[i] <= '9' && s[i] >= '0') || (s[i] >= 'a' && s[i] <= 'z')) 23 | { 24 | temp += s[i]; 25 | } 26 | else{ 27 | i++; 28 | break; 29 | } 30 | } 31 | j = i; 32 | if(temp != "" && s_map[temp] > 0){ 33 | s_map[temp] += 1; 34 | } 35 | else if(temp != "") 36 | s_map[temp] = 1; 37 | } 38 | string max_first = ""; 39 | int max_second = 0; 40 | map:: iterator it = s_map.begin(); 41 | for(;it != s_map.end();it++){ 42 | if(it -> second > max_second){ 43 | max_first = it -> first; 44 | max_second = it -> second; 45 | } 46 | } 47 | cout << max_first << " "<< max_second << endl; 48 | return 0; 49 | } 50 | -------------------------------------------------------------------------------- /8.1深度优先搜索DFS/5978.cpp: -------------------------------------------------------------------------------- 1 | //参考了:https://blog.csdn.net/qq_36502291/article/details/84678224 2 | #include 3 | #include 4 | int startx,starty,endx,endy,m,n; 5 | int dx[4] = {0,-1,0,1}, dy[4] = {-1,0,1,0}; 6 | bool has_no_result = true; 7 | int a[20][20]; 8 | struct point{ 9 | int x; 10 | int y; 11 | }point[5000]; 12 | void DFS(int x,int y,int num) 13 | { 14 | if(x == endx && y == endy){ 15 | for(int i = 0;i < num;i++){ 16 | printf("(%d,%d)->",point[i].x,point[i].y); 17 | } 18 | printf("(%d,%d)\n",x,y); 19 | has_no_result = false; 20 | return; 21 | } 22 | //判断下个点是否符合条件,如果可以,就把下个点存入point中 23 | point[num].x = x, point[num].y = y; 24 | for(int i = 0;i < 4;i++){ 25 | if(a[x + dx[i]][y + dy[i]] == 1 && 1 <= x + dx[i] <= m && 1 <= y + dy[i] <= n){ 26 | a[x][y] = 0;//表示当前这个点已经走过了 27 | DFS(x+dx[i],y+dy[i],num+1); 28 | a[x][y] = 1; 29 | } 30 | } 31 | } 32 | int main() 33 | { 34 | while(scanf("%d %d",&m,&n) != EOF){ 35 | for(int i = 1;i <= m;i++){ 36 | for(int j = 1;j <= n;j++){ 37 | scanf("%d",&a[i][j]); 38 | } 39 | } 40 | scanf("%d %d %d %d",&startx,&starty,&endx,&endy); 41 | DFS(startx,starty,0); 42 | if(has_no_result) 43 | printf("-1\n"); 44 | } 45 | } 46 | 47 | -------------------------------------------------------------------------------- /10.4最短路径/1768.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 100; 5 | const int inf = 0x3fffffff; 6 | //n 顶点数 d 起点到各点的最短路径 7 | int n,m,g[maxn][maxn]; 8 | int d[maxn]; 9 | bool vis[maxn] = {false}; 10 | void dijkstra(int s) 11 | { 12 | fill(d,d+maxn,inf); 13 | d[s] = 0; 14 | for(int i = 0;i < n;i++) 15 | { 16 | int u = -1,min_ = inf; 17 | for(int j = 0;j < n;j++) 18 | { 19 | if(vis[j] == false && d[j] < min_) 20 | { 21 | u = j; 22 | min_ = d[j]; 23 | } 24 | } 25 | if(u == -1) 26 | return; 27 | vis[u] = true; 28 | for(int v = 0;v < n;v++) 29 | { 30 | if(vis[v] == false && g[u][v] != 0 && d[u] + g[u][v] < d[v]) 31 | { 32 | d[v] = d[u] + g[u][v]; 33 | } 34 | } 35 | } 36 | } 37 | int main() 38 | { 39 | cin >> n >> m; 40 | for(int i = 0;i < n;i++) 41 | { 42 | for(int j = 0;j < n;j++) 43 | { 44 | cin >> g[i][j]; 45 | } 46 | } 47 | dijkstra(m); 48 | for(int i = 0;i < n;i++) 49 | { 50 | if(i == m) 51 | continue; 52 | else if(d[i] == inf) 53 | cout << "-1" << " "; 54 | else 55 | cout << d[i] << " "; 56 | } 57 | cout << endl; 58 | return 0; 59 | } 60 | -------------------------------------------------------------------------------- /10.5最小生成树/1813.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 1100; 5 | const int inf = 0x3fffffff; 6 | int n, g[maxn][maxn]; 7 | int d[maxn]; 8 | bool vis[maxn] = { false }; 9 | int prim() 10 | { 11 | fill(d, d + maxn, inf); 12 | d[1] = 0; 13 | int ans = 0; 14 | for (int i = 0; i < n; i++) 15 | { 16 | int u = -1, min_ = inf; 17 | for (int j = 1; j <= n; j++) 18 | { 19 | if (vis[j] == false && d[j] < min_) 20 | { 21 | u = j; 22 | min_ = d[j]; 23 | } 24 | } 25 | if (u == -1) 26 | return -1; 27 | vis[u] = true; 28 | ans += d[u]; 29 | for (int v = 1; v <= n; v++) 30 | { 31 | if (vis[v] == false && g[u][v] != inf && g[u][v] < d[v]) 32 | { 33 | d[v] = g[u][v]; 34 | } 35 | } 36 | } 37 | return ans; 38 | } 39 | int main() 40 | { 41 | while (cin >> n && n != 0) 42 | { 43 | fill(g[0], g[0] + maxn * maxn, inf); 44 | fill(vis, vis + maxn, false); 45 | int a, b, c; 46 | for (int i = 0; i < n * (n - 1) / 2; i++) 47 | { 48 | cin >> a >> b >> c; 49 | g[a][b] = c; 50 | g[b][a] = c; 51 | } 52 | int result = prim(); 53 | cout << result << endl; 54 | } 55 | } 56 | 57 | -------------------------------------------------------------------------------- /5.6大整数运算/1951.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int compare(string s1,string s2) 6 | { 7 | int result = 0; 8 | int len1 = s1.size(); 9 | int len2 = s2.size(); 10 | if(len1 > len2){ 11 | result = 1; 12 | } 13 | else if(len1 < len2){ 14 | result = 2; 15 | } 16 | else if(len1 == len2){ 17 | for(int i = 0;i < len1;i++){ 18 | if(s1.substr(i,1) > s2.substr(i,1)){ 19 | result = 1; 20 | break; 21 | } 22 | else if(s1.substr(i,1) < s2.substr(i,1)){ 23 | result = 2; 24 | break; 25 | } 26 | } 27 | } 28 | return result; 29 | } 30 | int main() 31 | { 32 | int n; 33 | while(cin >> n){ 34 | int k = 0; 35 | string str[110]; 36 | for(int i = 0;i < n;i++){ 37 | string s; 38 | cin >> s; 39 | str[k++] = s; 40 | } 41 | for(int i = 1;i <= k - 1;i++){ 42 | for(int j = 0;j < n - i;j++){ 43 | if(compare(str[j],str[j+1]) == 1){ 44 | string temp = str[j]; 45 | str[j] = str[j+1]; 46 | str[j+1] = temp; 47 | } 48 | } 49 | } 50 | for(int i = 0;i < k;i++){ 51 | cout << str[i] << endl; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /9.6并查集/2130.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int N = 10000005; 5 | int father[N]; 6 | int num[N]; 7 | int find_father(int x) 8 | { 9 | int a = x; 10 | while (x != father[x]) 11 | { 12 | x = father[x]; 13 | } 14 | while (a != father[a]) 15 | { 16 | int z = a; 17 | a = father[a]; 18 | father[z] = x; 19 | } 20 | return x; 21 | } 22 | void union_(int a, int b) 23 | { 24 | int fa_a = find_father(a); 25 | int fa_b = find_father(b); 26 | if (fa_a != fa_b) 27 | { 28 | father[fa_a] = fa_b; 29 | num[fa_b] += num[fa_a]; 30 | } 31 | } 32 | void init(int n) 33 | { 34 | for (int i = 1; i <= n; i++) 35 | { 36 | father[i] = i; 37 | num[i] = 1; 38 | } 39 | } 40 | int main() 41 | { 42 | int n,a,b; 43 | while (cin >> n) 44 | { 45 | if (n == 0) 46 | { 47 | cout << 1 << endl; 48 | continue; 49 | } 50 | init(10000005); 51 | int m = -1; 52 | for (int i = 0; i < n; i++) 53 | { 54 | cin >> a >> b; 55 | m = max(a, b); 56 | union_(a, b); 57 | } 58 | int max_ = 0; 59 | for (int i = 1; i <= m; i++) 60 | { 61 | if (max_ < num[i]) 62 | max_ = num[i]; 63 | } 64 | cout << max_ << endl; 65 | } 66 | return 0; 67 | } 68 | -------------------------------------------------------------------------------- /7.3链表/3596.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct node{ 5 | int data; 6 | node* next; 7 | }; 8 | node* create(int n) 9 | { 10 | node *head,*p,*end; 11 | head = new node; 12 | end = new node; 13 | head -> next = NULL; 14 | end = head; 15 | for(int i = 0;i < n;i++){ 16 | p = new node; 17 | scanf("%d",&(p -> data)); 18 | end -> next = p; 19 | end = p; 20 | } 21 | end -> next = NULL; 22 | return head; 23 | } 24 | void show(node* head) 25 | { 26 | node* p = head; 27 | p = p -> next; 28 | while(p != NULL){ 29 | printf("%d ",p -> data); 30 | p = p -> next; 31 | } 32 | cout << endl; 33 | } 34 | //将链表的节点取下来,依次用头插法插到另一个表头上 35 | node* reverse(node* head) 36 | { 37 | node* newHead = new node; 38 | newHead -> next = NULL; 39 | node* p = head; 40 | p = p -> next; 41 | while(p != NULL){ 42 | node* temp = p -> next; 43 | p -> next = newHead -> next; 44 | newHead -> next = p; 45 | p = temp; 46 | } 47 | return newHead; 48 | } 49 | int main() 50 | { 51 | int n; 52 | while(scanf("%d",&n) != EOF){ 53 | if(n != 0){ 54 | node* L = create(n); 55 | show(L); 56 | node* L2 = reverse(L); 57 | show(L2); 58 | } 59 | else{ 60 | printf("list is empty\n"); 61 | } 62 | } 63 | return 0; 64 | } 65 | -------------------------------------------------------------------------------- /4.1排序/2080.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | /** 5 | 题目描述 6 | 输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求: 7 | 1.先输出其中的奇数,并按从大到小排列; 8 | 2.然后输出其中的偶数,并按从小到大排列。 9 | 10 | 输入 11 | 任意排序的10个整数(0~100),彼此以空格分隔。 12 | 13 | 输出 14 | 可能有多组测试数据,对于每组数据,按照要求排序后输出,由空格分隔。 15 | 16 | 样例输入 17 | 0 56 19 81 59 48 35 90 83 75 18 | 17 86 71 51 30 1 9 36 14 16 19 | 样例输出 20 | 83 81 75 59 35 19 0 48 56 90 21 | 71 51 17 9 1 14 16 30 36 86 22 | 提示 23 | 24 | 多组数据,注意输出格式 25 | 1. 测试数据可能有很多组,请使用while(cin>>a[0]>>a[1]>>...>>a[9])类似的做法来实现; 26 | 2. 输入数据随机,有可能相等。 27 | **/ 28 | bool cmp1(int a,int b) 29 | { 30 | return a > b; 31 | } 32 | bool cmp2(int a,int b) 33 | { 34 | return a < b; 35 | } 36 | int main() 37 | { 38 | int a[10]; 39 | while(cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5] >> a[6] >> a[7] >> a[8] >> a[9]){ 40 | int b[11],c[11];//b奇数,c偶数 41 | int m = 0,n = 0; 42 | for(int i = 0;i < 10;i++){ 43 | if(a[i] % 2 != 0) 44 | { 45 | b[m++] = a[i]; 46 | } 47 | else if(a[i] % 2 == 0) 48 | { 49 | c[n++] = a[i]; 50 | } 51 | } 52 | sort(b,b+m,cmp1); 53 | sort(c,c+n,cmp2); 54 | for(int i = 0;i < m;i++){ 55 | cout << b[i] << " "; 56 | } 57 | for(int i = 0;i < n;i++){ 58 | cout << c[i] << " "; 59 | } 60 | cout << endl; 61 | } 62 | return 0; 63 | } 64 | -------------------------------------------------------------------------------- /10.6拓扑排序/2138.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | using namespace std; 7 | const int maxn = 550; 8 | vector g[maxn]; 9 | int n,m, in_degree[maxn]; 10 | bool topo_logical_sort() 11 | { 12 | int num = 0; 13 | queue q; 14 | for (int i = 0; i < n; i++) 15 | { 16 | if (in_degree[i] == 0) 17 | { 18 | q.push(i); 19 | } 20 | } 21 | while (!q.empty()) 22 | { 23 | int u = q.front(); 24 | q.pop(); 25 | for (int i = 0; i < g[u].size(); i++) 26 | { 27 | int v = g[u][i]; 28 | in_degree[v]--; 29 | if (in_degree[v] == 0) 30 | q.push(v); 31 | } 32 | g[u].clear(); 33 | num++; 34 | } 35 | if (num == n) 36 | return true; 37 | return false; 38 | } 39 | int main() 40 | { 41 | while (cin >> n >> m,n) 42 | { 43 | fill(in_degree, in_degree + maxn, 0); 44 | for (int i = 0; i < maxn; i++) 45 | { 46 | g[i].clear(); 47 | } 48 | int a, b; 49 | for (int i = 0; i < m; i++) 50 | { 51 | cin >> a >> b; 52 | g[a].push_back(b); 53 | in_degree[b]++; 54 | } 55 | 56 | if (topo_logical_sort()) 57 | cout << "YES" << endl; 58 | else 59 | cout << "NO" << endl; 60 | } 61 | return 0; 62 | } 63 | -------------------------------------------------------------------------------- /12.2KMP算法/2790.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | int next_[300]; 7 | void get_next(string s, int len) 8 | { 9 | int j = -1; 10 | next_[0] = -1; 11 | for (int i = 1; i < len; i++) 12 | { 13 | while (j != -1 && s[i] != s[j + 1]) 14 | { 15 | j = next_[j]; 16 | } 17 | if (s[i] == s[j + 1]) 18 | { 19 | j++; 20 | } 21 | next_[i] = j; 22 | } 23 | } 24 | int kmp(string text, string pattern) 25 | { 26 | int n = text.length(); 27 | int m = pattern.length(); 28 | get_next(pattern, m); 29 | int ans = 0, j = -1; 30 | for (int i = 0; i < n; i++) 31 | { 32 | while (j != -1 && text[i] != pattern[j + 1]) 33 | { 34 | j = next_[j]; 35 | } 36 | if (text[i] == pattern[j + 1]) 37 | { 38 | j++; 39 | } 40 | if (j == m - 1) 41 | { 42 | ans++; 43 | j = next_[j]; 44 | } 45 | } 46 | return ans; 47 | } 48 | int main() 49 | { 50 | int sum = 0, result, n; 51 | cin >> n; 52 | string p, s; 53 | //一定要有这一行,原因未明 54 | getchar(); 55 | getline(cin, p); 56 | for (int i = 0; i < n; i++) 57 | { 58 | result = 0; 59 | getline(cin, s); 60 | result = kmp(s, p); 61 | sum += result; 62 | } 63 | cout << sum << endl; 64 | return 0; 65 | } -------------------------------------------------------------------------------- /7.3链表/3597.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct node{ 5 | int data; 6 | node* next; 7 | }; 8 | node* create(int n) 9 | { 10 | node *head,*p,*end; 11 | head = new node; 12 | end = new node; 13 | head -> next = NULL; 14 | end = head; 15 | for(int i = 0;i < n;i++){ 16 | p = new node; 17 | scanf("%d",&(p -> data)); 18 | end -> next = p; 19 | end = p; 20 | } 21 | end -> next = NULL; 22 | return head; 23 | } 24 | void delete_(node* head) 25 | { 26 | node *p,*q; 27 | p = head; 28 | q = head; 29 | p = p -> next; 30 | while(p != NULL){ 31 | if(p -> data == q -> data){ 32 | q -> next = p -> next; 33 | delete(p); 34 | p = q -> next;//删除重复节点并将p指向下一位 35 | } 36 | else{ 37 | p = p -> next; 38 | q = q -> next; 39 | } 40 | } 41 | } 42 | void show(node* head) 43 | { 44 | node* p = head; 45 | p = p -> next; 46 | while(p != NULL){ 47 | printf("%d ",p -> data); 48 | p = p -> next; 49 | } 50 | cout << endl; 51 | } 52 | int main() 53 | { 54 | int n; 55 | while(scanf("%d",&n) != EOF){ 56 | if(n == 0){ 57 | printf("list is empty\n"); 58 | } 59 | else{ 60 | node* L = create(n); 61 | show(L); 62 | delete_(L); 63 | show(L); 64 | } 65 | } 66 | return 0; 67 | } 68 | -------------------------------------------------------------------------------- /13.2树状数组/5347.cpp: -------------------------------------------------------------------------------- 1 | //https://blog.csdn.net/a845717607/article/details/82079365 2 | #include 3 | #include 4 | using namespace std; 5 | const int maxn = 50010; 6 | #define lowbit(i) ((i) & (-i)) 7 | int c[maxn], a[maxn]; 8 | void update(int x, int v) 9 | { 10 | if(x == 0) 11 | c[0] += v; 12 | else 13 | for (int i = x; i < maxn; i += lowbit(i)) 14 | { 15 | c[i] += v; 16 | } 17 | } 18 | int get_sum(int x) 19 | { 20 | int sum = 0; 21 | if(x == -1) 22 | return 0; 23 | for (int i = x; i > 0; i -= lowbit(i)) 24 | { 25 | sum += c[i]; 26 | } 27 | return sum + c[0]; 28 | } 29 | int main() 30 | { 31 | int n; 32 | while (cin >> n && n != 0) 33 | { 34 | long long sum = 0; 35 | memset(c, 0, sizeof(c)); 36 | memset(a, 0, sizeof(a)); 37 | int sum1[maxn], sum2[maxn]; 38 | for (int i = 1; i <= n; i++) 39 | { 40 | cin >> a[i]; 41 | update(a[i], 1); 42 | sum1[i] = get_sum(a[i] - 1); 43 | //cout << "sum1-----" << sum1[i] << endl; 44 | } 45 | memset(c, 0, sizeof(c)); 46 | for (int i = n; i > 0; i--) 47 | { 48 | update(a[i], 1); 49 | sum2[i] = get_sum(a[i] - 1); 50 | } 51 | for (int i = 1; i <= n; i++) 52 | { 53 | sum += sum1[i] * sum2[i]; 54 | } 55 | cout << sum << endl; 56 | } 57 | return 0; 58 | } 59 | -------------------------------------------------------------------------------- /3.1简单模拟/6129.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | int main(){ 6 | int n,num; 7 | int a1 = 0,a2 = 0,a3 = 0,a4 = 0,a5 = 0; 8 | bool existA1 = false,existA2 = false; 9 | int countA4 = 0,count = 1; 10 | scanf("%d",&n); 11 | for(int i = 0;i < n;i++){ 12 | scanf("%d", &num); 13 | if(num % 5 == 0){ 14 | if(num % 2 == 0){ 15 | existA1 = true; 16 | a1 += num; 17 | } 18 | } 19 | else if(num % 5 == 1){ 20 | existA2 = true; 21 | if(count % 2 == 0) 22 | num = -num; 23 | a2 += num; 24 | count++; 25 | } 26 | else if(num % 5 == 2){ 27 | a3++; 28 | } 29 | else if(num % 5 == 3){ 30 | a4 += num; 31 | countA4++; 32 | } 33 | else 34 | a5 = (num > a5 ? num : a5); 35 | } 36 | if(existA1) 37 | printf("%d", a1); 38 | else 39 | printf("%c", 'N'); 40 | if(existA2) 41 | printf(" %d", a2); 42 | else 43 | printf(" %c", 'N'); 44 | if(a3 != 0) 45 | printf(" %d", a3); 46 | else 47 | printf(" %c", 'N'); 48 | if(countA4 != 0) 49 | printf(" %.1f",(double)a4 / countA4); 50 | else 51 | printf(" %c", 'N'); 52 | if(a5 != 0) 53 | printf(" %d\n", a5); 54 | else 55 | printf(" %c\n", 'N'); 56 | return 0; 57 | } 58 | -------------------------------------------------------------------------------- /6.2set常见用法详解/6126.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | int main() 7 | { 8 | int n; 9 | scanf("%d",&n); 10 | vector > sets; 11 | for(int i = 0;i < n;i++){ 12 | int m; 13 | scanf("%d",&m); 14 | set temp; 15 | for(int j = 0;j < m;j++){ 16 | int a; 17 | scanf("%d",&a); 18 | temp.insert(a); 19 | } 20 | sets.push_back(temp); 21 | } 22 | int k; 23 | scanf("%d",&k); 24 | set all; 25 | set distinct; 26 | for(int i = 0;i < k;i++){ 27 | all.clear(); 28 | distinct.clear(); 29 | int b,c; 30 | scanf("%d %d",&b,&c); 31 | for(set :: iterator it = sets[b - 1].begin();it != sets[b - 1].end();it++){ 32 | all.insert(*it); 33 | } 34 | for(set :: iterator it = sets[c - 1].begin();it != sets[c - 1].end();it++){ 35 | all.insert(*it); 36 | } 37 | for(set :: iterator it1 = sets[b - 1].begin();it1 != sets[b - 1].end();it1++){ 38 | //如果在最后一位之前找到,就表示sets2里有sets1的元素 39 | if(sets[c - 1].find(*it1) != sets[c - 1].end()){ 40 | distinct.insert(*it1); 41 | } 42 | } 43 | double size1 = all.size(); 44 | double size2 = distinct.size(); 45 | double result = size2 / size1 * 100; 46 | printf("%.1f%%\n",result); 47 | } 48 | return 0; 49 | } 50 | -------------------------------------------------------------------------------- /11.8 动态规划总结/2090.cpp: -------------------------------------------------------------------------------- 1 | //https://blog.csdn.net/zjfclh/article/details/21128903 2 | #include 3 | #include 4 | 5 | #define times 1000 6 | 7 | double num[30]; 8 | int d[30]; 9 | int dp[3000000]; 10 | 11 | int maxM(int a, int b) { 12 | return a > b ? a : b; 13 | } 14 | 15 | int main() { 16 | double Q, ans; 17 | int N, k; 18 | while(scanf("%lf %d",&Q,&N) != EOF && N != 0) { 19 | int i, j, m; 20 | k = 0; //可以报销的发票数 21 | for(i = 0; i < N; i++){ 22 | scanf("%d",&m); 23 | double total = 0; //单张发票的总额 24 | bool flag = true; //标志发票是否有效 25 | for(j = 0;j < m;j++){ 26 | char c; 27 | double temp; 28 | scanf(" %c:%lf",&c,&temp); 29 | if(flag && (c == 'A' || c == 'B' || c == 'C') && temp <= 600) 30 | total += temp; 31 | else 32 | flag = false; 33 | } 34 | if(flag && total <= 1000){ 35 | num[k++] = total; 36 | } 37 | } 38 | 39 | for(i = 0;i < k;i++) 40 | d[i] = num[i] * times; 41 | int q = Q * times; //将小数转化为整数,即化为0-1背包问题 42 | 43 | memset(dp,0,sizeof(dp)); //dp初始化 44 | ans = 0; //最大报销额初始化 45 | for(i = 0; i < k; i++) { 46 | for(j = q; j >= d[i]; j--) { 47 | dp[j] = maxM(dp[j],dp[j - d[i]] + d[i]); //背包公式 48 | ans = maxM(ans,dp[j]); 49 | } 50 | } 51 | ans /= times; //还原为整数 52 | printf("%.2lf\n",ans); 53 | } 54 | return 0; 55 | } 56 | -------------------------------------------------------------------------------- /3.1简单模拟/6172.cpp: -------------------------------------------------------------------------------- 1 | //答案错误43%,不知道哪里错了... 2 | #include 3 | #include 4 | using namespace std; 5 | int main() 6 | { 7 | int n; 8 | cin >> n; 9 | int aWin = 0,bWin = 0,noWin = 0; 10 | int aWinC = 0,aWinB = 0,aWinJ = 0; 11 | int bWinC = 0,bWinB = 0,bWinJ = 0; 12 | for(int i = 0;i < n;i++){ 13 | char a,b; 14 | cin >> a >> b; 15 | if(a == 'C' && b == 'J'){ 16 | aWin++; 17 | aWinC++; 18 | } 19 | else if(a == 'J' && b == 'B'){ 20 | aWin++; 21 | aWinJ++; 22 | } 23 | else if(a == 'B' && b == 'C'){ 24 | aWin++; 25 | aWinB++; 26 | } 27 | else if(b == 'C' && a == 'J'){ 28 | bWin++; 29 | bWinC++; 30 | } 31 | else if(b == 'J' && a == 'B'){ 32 | bWin++; 33 | bWinJ++; 34 | } 35 | else if(b == 'B' && a == 'C'){ 36 | bWin++; 37 | bWinB++; 38 | } 39 | else if((a == 'C' && b == 'C') || (a == 'J' && b == 'J') || (a == 'B' && b == 'B')) 40 | noWin++; 41 | } 42 | printf("%d %d %d\n",aWin,noWin,bWin); 43 | printf("%d %d %d\n",bWin,noWin,aWin); 44 | if(aWinB >= aWinC) 45 | printf("B "); 46 | else if(aWinC >= aWinJ) 47 | printf("C "); 48 | else printf("J "); 49 | if(bWinB >= bWinC) 50 | printf("B"); 51 | else if(bWinC >= bWinJ) 52 | printf("C"); 53 | else 54 | printf("J"); 55 | return 0; 56 | } 57 | -------------------------------------------------------------------------------- /10.5最小生成树/1972.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #pragma warning(disable:4996) 6 | using namespace std; 7 | 8 | struct node { 9 | int x, y, len; 10 | }road[5050]; 11 | int pre[30]; 12 | 13 | int find(int x) 14 | { 15 | if (pre[x] != x) 16 | pre[x] = find(pre[x]); 17 | return pre[x]; 18 | } 19 | 20 | int Union(int a, int b) 21 | { 22 | int x, y; 23 | x = find(a); 24 | y = find(b); 25 | if (x == y) return 1; 26 | else 27 | { 28 | pre[y] = x; 29 | return 0; 30 | } 31 | } 32 | 33 | bool cmp(node a, node b) 34 | { 35 | return a.len < b.len; 36 | } 37 | 38 | int main() 39 | { 40 | int n, m, i, j, p, q; 41 | char a, b; 42 | while (scanf("%d", &n) == 1) 43 | { 44 | if (n == 0) break; 45 | int k = 0; 46 | for (i = 1; i < n; i++) 47 | { 48 | cin >> a >> m; 49 | for (j = 1; j <= m; j++) 50 | { 51 | road[k].x = a - 'A' + 1; 52 | cin >> b >> q; 53 | road[k].y = b - 'A' + 1; 54 | road[k].len = q; 55 | k++; 56 | } 57 | pre[i] = i; 58 | } 59 | pre[i] = i; 60 | sort(road, road + k, cmp); 61 | int ans = 0; 62 | for (i = 0; i < k; i++) 63 | { 64 | if (Union(road[i].x, road[i].y) == 0) 65 | ans += road[i].len; 66 | } 67 | printf("%d\n", ans); 68 | } 69 | return 0; 70 | } -------------------------------------------------------------------------------- /13.2树状数组/2497.cpp: -------------------------------------------------------------------------------- 1 | //AC,但是在vs2017环境下发生异常。 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | using namespace std; 8 | const int maxn = 500010; 9 | int a[maxn]; 10 | long long num; 11 | void merge(vector a, int L1, int R1, int L2, int R2) 12 | { 13 | int i = L1, j = L2; 14 | int temp[maxn], index = 0; 15 | while (i <= R1 && j <= R2) 16 | { 17 | if (a[i] <= a[j]) 18 | { 19 | temp[index++] = a[i++]; 20 | } 21 | else 22 | { 23 | num += (R1 - i + 1); 24 | temp[index++] = a[j++]; 25 | } 26 | } 27 | while (i <= R1) 28 | temp[index++] = a[i++]; 29 | while (j <= R2) 30 | temp[index++] = a[j++]; 31 | for (int i = 0; i < index; i++) 32 | { 33 | a[L1 + i] = temp[i]; 34 | } 35 | } 36 | void merge_sort(vector a, int left, int right) 37 | { 38 | if (left < right) 39 | { 40 | int mid = (left + right) / 2; 41 | merge_sort(a, left, mid); 42 | merge_sort(a, mid + 1, right); 43 | merge(a, left, mid, mid + 1, right); 44 | } 45 | } 46 | int main() 47 | { 48 | vector a; 49 | string s; 50 | while (getline(cin, s)) 51 | { 52 | num = 0; 53 | a.clear(); 54 | stringstream ss(s); 55 | int temp; 56 | while (ss >> temp) 57 | a.push_back(temp); 58 | int n = a.size(); 59 | merge_sort(a, 0, n - 1); 60 | cout << num << endl; 61 | } 62 | return 0; 63 | } 64 | -------------------------------------------------------------------------------- /3.5进制转换/1942.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | //注意点:考虑0的情况 4 | int main() 5 | { 6 | int a,b; 7 | char n[100]; 8 | while(scanf("%d %s %d",&a,&n,&b) != EOF){ 9 | int factor = 1; 10 | int len = strlen(n); 11 | long long result = 0; 12 | for(int i = len - 1;i >= 0;i--){ 13 | int temp; 14 | if(n[i] >= 'a' && n[i] <= 'z'){ 15 | temp = n[i] - 'a' + 10; 16 | } 17 | else if(n[i] >= 'A' && n[i] <= 'Z'){ 18 | temp = n[i] - 'A' + 10; 19 | } 20 | else if(n[i] >= '0' && n[i] <= '9'){ 21 | temp = n[i] - '0'; 22 | } 23 | result += temp * factor; 24 | factor *= a; 25 | } 26 | //printf("%d\n",result); 27 | int factor2 = 1; 28 | char final_result[100]; 29 | int j = 0; 30 | if(result == 0){ 31 | printf("0\n"); 32 | } 33 | else{ 34 | while(result){ 35 | int temp_result = result % b; 36 | if(temp_result <= 9 && temp_result >=0){ 37 | final_result[j++] = temp_result + '0'; 38 | } 39 | else{ 40 | final_result[j++] = temp_result - 10 + 'A'; 41 | } 42 | result = result / b; 43 | } 44 | j -= 1; 45 | while(j >= 0){ 46 | printf("%c",final_result[j]); 47 | j--; 48 | } 49 | printf("\n"); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /10.5最小生成树/1954.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 1100; 5 | const int inf = 0x3fffffff; 6 | //n村庄数 7 | int n,m, g[maxn][maxn]; 8 | int d[maxn]; 9 | bool vis[maxn] = { false }; 10 | int prim() 11 | { 12 | fill(d, d + maxn, inf); 13 | d[1] = 0; 14 | int ans = 0; 15 | for (int i = 1; i <= n; i++) 16 | { 17 | int u = -1, min_ = inf; 18 | for (int j = 1; j <= n; j++) 19 | { 20 | if (vis[j] == false && d[j] < min_) 21 | { 22 | u = j; 23 | min_ = d[j]; 24 | } 25 | } 26 | if (u == -1) 27 | return -1; 28 | vis[u] = true; 29 | ans += d[u]; 30 | for (int v = 1; v <= n; v++) 31 | { 32 | if (vis[v] == false && g[u][v] != inf && g[u][v] < d[v]) 33 | { 34 | d[v] = g[u][v]; 35 | } 36 | } 37 | } 38 | return ans; 39 | } 40 | int main() 41 | { 42 | while (cin >> m >> n && m != 0) 43 | { 44 | fill(g[0], g[0] + maxn * maxn, inf); 45 | fill(vis, vis + maxn, false); 46 | for (int i = 0; i < m; i++) 47 | { 48 | int a, b, c; 49 | cin >> a >> b >> c; 50 | //考虑有道路重复输入的可能 51 | if (c < g[a][b]) 52 | { 53 | g[a][b] = g[b][a] = c; 54 | } 55 | } 56 | int result = prim(); 57 | if (result != -1) 58 | cout << result << endl; 59 | else 60 | cout << "?" << endl; 61 | } 62 | return 0; 63 | } 64 | -------------------------------------------------------------------------------- /4.1排序/1926.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | /* 7 | 使用格式:类型strcmp(参数1,参数2) 8 | 功 能: 比较参数1和参数2 9 | 1、若参数1>参数2,返回正数 10 | 2、若参数1<参数2,返回负数 11 | 3、若参数1=参数2,返回0 12 | */ 13 | typedef struct{ 14 | char num[7];//数组不能开太大,不然会内存溢出,但是也不能开太小,数组有结束符,长度比字符串长度大1 15 | char name[9]; 16 | int score; 17 | }Student; 18 | 19 | bool cmp1(Student s1,Student s2){ 20 | return strcmp(s1.num,s2.num) < 0; 21 | } 22 | 23 | bool cmp2(Student s1,Student s2){ 24 | return strcmp(s1.name,s2.name) != 0 ? strcmp(s1.name,s2.name) < 0 : strcmp(s1.num,s2.num) < 0; 25 | } 26 | 27 | bool cmp3(Student s1,Student s2){ 28 | return s1.score != s2.score ? s1.score 2 | using namespace std; 3 | int arry[8][8],result[100]; 4 | int map = 0,index = 0; 5 | void findQueen(int i); 6 | bool check(int k,int j); 7 | void print(); 8 | int main() { 9 | int n; 10 | findQueen(0); 11 | while(cin >> n){ 12 | for(int i = 0;i < n;i++){ 13 | int s; 14 | cin >> s; 15 | cout << result[s-1] << endl; 16 | } 17 | } 18 | } 19 | 20 | void findQueen(int i){//寻找皇后节点 21 | if(i > 7){//八皇后的解 22 | map++; 23 | print();//打印八皇后的解 24 | return; 25 | } 26 | 27 | for(int m = 0;m < 8;m++){//深度回溯,递归算法 28 | if(check(i,m)){//检查皇后摆放是否合适 29 | arry[i][m] = 1; 30 | findQueen(i+1); 31 | arry[i][m] = 0;//清零,以免回溯的时候出现脏数据 32 | } 33 | } 34 | } 35 | 36 | bool check(int k,int j){//判断节点是否合适 37 | for(int i = 0;i < 8;i++){//检查行列冲突 38 | if(arry[i][j] == 1){ 39 | return false; 40 | } 41 | } 42 | for(int i = k-1,m = j-1; i >= 0 && m >= 0; i--,m--){//检查左对角线 43 | if(arry[i][m] == 1){ 44 | return false; 45 | } 46 | } 47 | for(int i = k-1,m = j+1; i >= 0 && m <= 7; i--,m++){//检查右对角线 48 | if(arry[i][m] == 1){ 49 | return false; 50 | } 51 | } 52 | return true; 53 | } 54 | 55 | void print(){ 56 | //cout << "方案" << map << ":" << endl; 57 | int temp = 0; 58 | for(int i = 0;i < 8;i++){ 59 | for(int m = 0;m < 8;m++){ 60 | if(arry[i][m] == 1) 61 | temp = temp * 10 + (m+1); 62 | } 63 | } 64 | result[index++] = temp; 65 | temp = 0; 66 | } 67 | -------------------------------------------------------------------------------- /6.6priority_queue用法详解/1985.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | using namespace std; 9 | char str[100006]; 10 | string task[100000]; 11 | int in[100000]; 12 | int n; 13 | 14 | class cmp { 15 | public: 16 | bool operator()(int a,int b) const { 17 | return task[a] > task[b]; 18 | } 19 | }; 20 | 21 | map mm; 22 | priority_queue,cmp> pq; 23 | vector l[100000]; 24 | 25 | int getIndex(char *s) { 26 | map::iterator it=mm.find(string(s)); 27 | if (it == mm.end()) { 28 | int ret = mm.size(); 29 | task[ret] = string(s); 30 | mm.insert(make_pair(task[ret],ret)); 31 | return ret; 32 | } 33 | return it -> second; 34 | } 35 | 36 | int main() { 37 | while(scanf("%d",&n) != EOF) { 38 | mm.clear(); 39 | for(int i = 0;i < n;i++) l[i].clear(),in[i] = 0; 40 | for(int i = 0;i < n;i++) { 41 | scanf("%s",str); 42 | char *p = strtok(str,"(,)"); 43 | int t = getIndex(p); 44 | while(p = strtok(NULL,"(,)")) { 45 | if (!strcmp(p,"NULL")) continue; 46 | int t1 = getIndex(p); 47 | l[t].push_back(t1); 48 | in[t1]++; 49 | } 50 | } 51 | for(int i = 0;i < n;i++) if (!in[i]) pq.push(i); 52 | int first = 1; 53 | while(!pq.empty()) { 54 | if (first) 55 | first = 0; 56 | else 57 | putchar(' '); 58 | int cur = pq.top(); 59 | pq.pop(); 60 | printf("%s",task[cur].c_str()); 61 | for(int i = 0;i < l[cur].size();i++) { 62 | if (!--in[l[cur][i]]) 63 | pq.push(l[cur][i]); 64 | } 65 | } 66 | puts(""); 67 | } 68 | return 0; 69 | } 70 | -------------------------------------------------------------------------------- /10.6拓扑排序/2117.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | using namespace std; 7 | const int maxn = 550; 8 | vector g[maxn]; 9 | vector result; 10 | int n, m, in_degree[maxn]; 11 | bool topo_logical_sort() 12 | { 13 | int num = 0; 14 | priority_queue,greater > q; 15 | for (int i = 1; i <= n; i++) 16 | { 17 | if (in_degree[i] == 0) 18 | { 19 | q.push(i); 20 | } 21 | } 22 | while (!q.empty()) 23 | { 24 | int u = q.top(); 25 | result.push_back(u); 26 | q.pop(); 27 | for (int i = 0; i < g[u].size(); i++) 28 | { 29 | int v = g[u][i]; 30 | in_degree[v]--; 31 | if (in_degree[v] == 0) 32 | q.push(v); 33 | } 34 | g[u].clear(); 35 | num++; 36 | } 37 | if (num == n) 38 | return true; 39 | return false; 40 | } 41 | int main() 42 | { 43 | while (cin >> n >> m,m,n) 44 | { 45 | fill(in_degree, in_degree + maxn, 0); 46 | result.clear(); 47 | for (int i = 0; i < maxn; i++) 48 | { 49 | g[i].clear(); 50 | } 51 | int a, b; 52 | for (int i = 0; i < m; i++) 53 | { 54 | cin >> a >> b; 55 | g[a].push_back(b); 56 | in_degree[b]++; 57 | } 58 | 59 | if (topo_logical_sort()) 60 | { 61 | for (vector::iterator it = result.begin(); it != result.end(); it++) 62 | cout << *it << " "; 63 | cout << endl; 64 | } 65 | } 66 | return 0; 67 | } 68 | -------------------------------------------------------------------------------- /5.6大整数运算/1950.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | //思路:https://blog.csdn.net/Jaster_wisdom/article/details/52107785 6 | //三言两语说不清楚 7 | int result[1100]; 8 | //判断一个字符数组是否每一位都是0 9 | void m2n(char str[],int m,int n) 10 | { 11 | int shang[1100]; 12 | int flag = 1; 13 | char result[1100]; 14 | int k = 0; 15 | while(flag == 1){ 16 | int temp = 0; 17 | for(int i = 0;i < strlen(str);i++){ 18 | int s; 19 | if(str[i] >= '0' && str[i] <= '9'){ 20 | s = str[i] - '0'; 21 | } 22 | else if(str[i] >= 'A' && str[i] <= 'Z'){ 23 | s = str[i] - 'A' + 10; 24 | } 25 | int factor = temp * m + s; 26 | temp = factor % n; 27 | int t = factor / n; 28 | if(t >= 0 && t <= 9) 29 | str[i] = t + '0'; 30 | else if(t >= 10){ 31 | str[i] = t - 10 + 'A'; 32 | } 33 | } 34 | if(temp <= 9) 35 | result[k++] = temp + '0'; 36 | else 37 | result[k++] = temp + 'a' - 10; 38 | int j; 39 | for(j = 0;j < strlen(str);j++){ 40 | if(str[j] != '0'){ 41 | flag = 1; 42 | break; 43 | } 44 | } 45 | if(j == strlen(str)) 46 | flag = 0; 47 | } 48 | for(int i = k - 1;i >= 0;i--){ 49 | cout << result[i]; 50 | } 51 | } 52 | int main() 53 | { 54 | int m,n; 55 | while(cin >> m >> n){ 56 | char s[1100]; 57 | cin >> s; 58 | m2n(s,m,n); 59 | cout << endl; 60 | } 61 | return 0; 62 | } 63 | -------------------------------------------------------------------------------- /11.8 动态规划总结/1799.cpp: -------------------------------------------------------------------------------- 1 | //TK题库答案 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int a[64]; 8 | int t[1 << 15]; 9 | int n; 10 | char str[1024]; 11 | 12 | int cmp(const void *a,const void *b) { 13 | return *(int *)a - *(int *)b; 14 | } 15 | 16 | int main() { 17 | int i,j,k,n1,n2,l,r,m,s,ret; 18 | char *p; 19 | while(gets(str)) { 20 | for(i = 0;str[i];i++) 21 | if (!isdigit(str[i]) && str[i] != ' ') 22 | break; 23 | if (str[i]) { 24 | puts("ERROR"); 25 | continue; 26 | } 27 | for(p = strtok(str," "),s = n = 0;p;n++,p = strtok(NULL," ")) { 28 | sscanf(p,"%d",&a[n]); 29 | s += a[n]; 30 | } 31 | 32 | n1 = n - n / 2,n2 = n - n1,ret = s; 33 | for(i = 0;i < (1 << n1);i++) { 34 | for(j = k = 0;j < n1;j++) if (i & (1 << j)) k += a[j]; 35 | t[i] = k; 36 | } 37 | qsort(t,m = 1 << n1,sizeof(t[0]),cmp); 38 | for(i = 0;i < (1 << n2);i++) { 39 | for(j = k = 0;j < n2;j++) 40 | if (i & (1 << j)) 41 | k += a[n1 + j]; 42 | for(l = 0,r = m;l 0 && s - k - t[l - 1] - k - t[l - 1] < ret) 52 | ret = s - k - t[l - 1] - k - t[l - 1]; 53 | } 54 | printf("%d %d\n",(s + ret) / 2,(s - ret) / 2); 55 | } 56 | return 0; 57 | } 58 | -------------------------------------------------------------------------------- /5.6大整数运算/1952.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | char two[1100],result[1100],ten[1100]; 5 | void m2n(char str[],int m,int n,char result[]) 6 | { 7 | int shang[1100]; 8 | int flag = 1; 9 | int k = 0; 10 | while(flag == 1){ 11 | int temp = 0; 12 | for(int i = 0;i < strlen(str);i++){ 13 | int s; 14 | if(str[i] >= '0' && str[i] <= '9'){ 15 | s = str[i] - '0'; 16 | } 17 | else if(str[i] >= 'A' && str[i] <= 'Z'){ 18 | s = str[i] - 'A' + 10; 19 | } 20 | int factor = temp * m + s; 21 | temp = factor % n; 22 | int t = factor / n; 23 | if(t >= 0 && t <= 9) 24 | str[i] = t + '0'; 25 | else if(t >= 10){ 26 | str[i] = t - 10 + 'A'; 27 | } 28 | } 29 | if(temp <= 9) 30 | result[k++] = temp + '0'; 31 | else 32 | result[k++] = temp + 'a' - 10; 33 | int j; 34 | for(j = 0;j < strlen(str);j++){ 35 | if(str[j] != '0'){ 36 | flag = 1; 37 | break; 38 | } 39 | } 40 | if(j == strlen(str)) 41 | flag = 0; 42 | } 43 | /*for(int i = k - 1;i >= 0;i--){ 44 | cout << result[i]; 45 | }*/ 46 | } 47 | int main() 48 | { 49 | while(cin >> ten){ 50 | m2n(ten,10,2,two); 51 | m2n(two,2,10,result); 52 | for(int i = strlen(result) - 1;i >= 0;i--){ 53 | cout << result[i]; 54 | } 55 | cout << endl; 56 | memset(two,0,sizeof(two)); 57 | memset(result,0,sizeof(result)); 58 | memset(ten,0,sizeof(ten)); 59 | } 60 | return 0; 61 | } 62 | -------------------------------------------------------------------------------- /10.5最小生成树/1913.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | //本答案通过了牛客网的测试用例,但是没有通过codeup的测试用例 5 | using namespace std; 6 | const int maxn = 110; 7 | const double inf = 0x3fffffff; 8 | int n; 9 | double d[maxn], g[maxn][maxn]; 10 | bool vis[maxn] = { false }; 11 | struct point { 12 | double x, y; 13 | }; 14 | void prim() 15 | { 16 | fill(d, d + maxn, inf); 17 | d[0] = 0; 18 | double ans = 0; 19 | for (int i = 0; i < n; i++) 20 | { 21 | int u = -1; 22 | double min_ = inf; 23 | for (int j = 0; j < n; j++) 24 | { 25 | if (vis[j] == false && d[j] < min_) 26 | { 27 | u = j; 28 | min_ = d[j]; 29 | } 30 | } 31 | if (u == -1) 32 | return; 33 | vis[u] = true; 34 | ans += d[u]; 35 | for (int v = 0; v < n; v++) 36 | { 37 | if (vis[v] == false && g[u][v] != inf && g[u][v] < d[v]) 38 | { 39 | d[v] = g[u][v]; 40 | } 41 | } 42 | } 43 | printf("%.2f\n", ans); 44 | } 45 | int main() 46 | { 47 | while (cin >> n && n != 0) 48 | { 49 | fill(g[0], g[0] + maxn * maxn, inf); 50 | fill(vis, vis + maxn, false); 51 | point p[maxn]; 52 | for (int i = 0; i < n; i++) 53 | { 54 | double a, b; 55 | cin >> a >> b; 56 | p[i].x = a; 57 | p[i].y = b; 58 | } 59 | for (int i = 0; i < n; i++) 60 | { 61 | for (int j = 0; j < n; j++) 62 | { 63 | if(i != j) 64 | g[i][j] = sqrt(double((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y)));; 65 | } 66 | } 67 | prim(); 68 | } 69 | } -------------------------------------------------------------------------------- /4.1排序/2088.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | /** 6 | 题目描述 7 | 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。 8 | 给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。 9 | 10 | 输入 11 | 测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N < 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G; 12 | 第2行排序给出第1题至第M题的正整数分值; 13 | 以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。 14 | 当读入的考生人数为0时,输入结束,该场考试不予处理。 15 | 16 | 输出 17 | 对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出。 18 | 19 | 样例输入 20 | 3 5 32 21 | 17 10 12 9 15 22 | CS22003 5 1 2 3 4 5 23 | CS22004 3 5 1 3 24 | CS22002 2 1 5 25 | 0 26 | 样例输出 27 | 3 28 | CS22003 63 29 | CS22004 44 30 | CS22002 32 31 | **/ 32 | //https://blog.csdn.net/a845717607/article/details/89428715 33 | struct student 34 | { 35 | char id[30]; 36 | int test_num; 37 | int test_id[20]; 38 | int sum; 39 | }stu[1010]; 40 | bool cmp(student a,student b) 41 | { 42 | if(a.sum == b.sum) 43 | return strcmp(a.id,b.id) < 0; 44 | return a.sum > b.sum; 45 | } 46 | int main() 47 | { 48 | int n,score[20],point,num,person = 0; 49 | while(~scanf("%d",&n)) 50 | { 51 | if(n == 0) break; 52 | scanf("%d %d",&num,&point); 53 | for(int i = 0;i < num;i++) 54 | scanf("%d",&score[i]); 55 | for(int i = 0;i < n;i++) 56 | { 57 | stu[i].sum = 0; 58 | scanf("%s %d",stu[i].id,&stu[i].test_num); 59 | for(int j = 0;j < stu[i].test_num;j++) 60 | { 61 | scanf("%d",&stu[i].test_id[j]); 62 | stu[i].sum += score[stu[i].test_id[j]-1]; 63 | } 64 | if(stu[i].sum >= point) 65 | person++; 66 | } 67 | sort(stu,stu + n,cmp); 68 | printf("%d\n",person); 69 | for(int i = 0;i < n;i++) 70 | { 71 | if(stu[i].sum >= point) 72 | printf("%s %d\n",stu[i].id,stu[i].sum); 73 | else break; 74 | } 75 | } 76 | return 0; 77 | } 78 | -------------------------------------------------------------------------------- /8.2广度优先搜索BFS/4054.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | using namespace std; 6 | const int maxn = 100; 7 | struct node{ 8 | int x; 9 | int y; 10 | int step; 11 | }now,temp; 12 | 13 | char maze[maxn][maxn]; 14 | int X[9] = {0,0,0,1,-1,1,1,-1,-1}; 15 | int Y[9] = {0,1,-1,0,0,1,-1,1,-1}; 16 | 17 | bool flag; 18 | 19 | bool judge(int x,int y) 20 | { 21 | if(x >= 8 || x < 0) 22 | return false; 23 | if(y >= 8 || y < 0) 24 | return false; 25 | return true; 26 | } 27 | 28 | void BFS() 29 | { 30 | now.x = 7; 31 | now.y = 0; 32 | now.step = 0; 33 | queue q; 34 | q.push(now); 35 | while(!q.empty()){ 36 | now = q.front(); 37 | q.pop(); 38 | for(int i = 0;i < 9;i++){ 39 | temp.x = now.x + X[i]; 40 | temp.y = now.y + Y[i]; 41 | temp.step = now.step + 1; 42 | //maze[temp.x][temp.y]表示下一步要走的位置,减去步数表示上方多少步有石头,这样走了step步后,石头就落到了下一步要走的位置 43 | if(judge(temp.x,temp.y) && maze[temp.x - temp.step][temp.y] != 'S' && maze[temp.x - temp.step + 1][temp.y] != 'S'){ 44 | if(maze[temp.x][temp.y] == 'A' || temp.step > 8){ 45 | flag = 1; 46 | return ; 47 | } 48 | q.push(temp); 49 | } 50 | } 51 | } 52 | return; 53 | } 54 | 55 | int main() 56 | { 57 | int n; 58 | scanf("%d",&n); 59 | getchar(); 60 | int k = 1; 61 | while(n--){ 62 | flag = false; 63 | for(int i = 0;i < 8;i++){ 64 | scanf("%s",maze[i]); 65 | } 66 | BFS(); 67 | if(flag == true){ 68 | printf("Case #%d: Yes\n",k); 69 | } 70 | else{ 71 | printf("Case #%d: No\n",k); 72 | } 73 | k++; 74 | } 75 | return 0; 76 | } 77 | -------------------------------------------------------------------------------- /9.6并查集/1106.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int N = 1100; 4 | int father[N]; 5 | bool is_root[N]; 6 | int find_father(int x) 7 | { 8 | int a = x; 9 | while (x != father[x]) 10 | { 11 | x = father[x]; 12 | } 13 | while (a != father[a]) 14 | { 15 | int z = a; 16 | a = father[a]; 17 | father[z] = x; 18 | } 19 | return x; 20 | } 21 | void union_(int a, int b) 22 | { 23 | int fa_a = find_father(a); 24 | int fa_b = find_father(b); 25 | if (fa_a != fa_b) 26 | { 27 | father[fa_a] = fa_b; 28 | } 29 | } 30 | void init(int n) 31 | { 32 | for (int i = 1; i <= n; i++) 33 | { 34 | father[i] = i; 35 | is_root[i] = false; 36 | } 37 | } 38 | int main() 39 | { 40 | int n, m, a, b; 41 | while (cin >> n >> m) 42 | { 43 | if (n == 0 && m == 0) 44 | break; 45 | else if (m > n - 1) 46 | { 47 | for (int i = 0; i < m; i++) 48 | { 49 | cin >> a >> b; 50 | union_(a, b); 51 | } 52 | cout << "No" << endl; 53 | } 54 | else 55 | { 56 | init(n); 57 | for (int i = 0; i < m; i++) 58 | { 59 | cin >> a >> b; 60 | union_(a, b); 61 | } 62 | for (int i = 1; i <= n; i++) 63 | { 64 | is_root[find_father(i)] = true; 65 | } 66 | int ans = 0; 67 | for (int i = 1; i <= n; i++) 68 | { 69 | ans += is_root[i]; 70 | } 71 | if (ans == 1) 72 | { 73 | cout << "Yes" << endl; 74 | } 75 | else 76 | { 77 | cout << "No" << endl; 78 | } 79 | } 80 | } 81 | return 0; 82 | } 83 | -------------------------------------------------------------------------------- /4.1排序/1978.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | /** 6 | 题目描述 7 | 请写一个程序,对于一个m行m列的(1 b; 33 | } 34 | int main() 35 | { 36 | int m; 37 | while(cin >> m){ 38 | if(m >= 10 || m <= 1) 39 | break; 40 | int n=0,i,j,a[20][20],sum,num[22]; 41 | for(i = 0;i < m;i++) 42 | { 43 | for(j = 0;j < m;j++) 44 | { 45 | cin >> a[i][j]; 46 | } 47 | } 48 | //行 49 | for(i = 0;i < m;i++) 50 | { 51 | sum = 0; 52 | for(j = 0;j < m;j++) 53 | { 54 | sum += a[i][j]; 55 | } 56 | num[n++] = sum; 57 | } 58 | //列 59 | for(j = 0;j < m;j++) 60 | { 61 | sum = 0; 62 | for(i = 0;i < m;i++) 63 | { 64 | sum += a[i][j]; 65 | } 66 | num[n++] = sum; 67 | } 68 | //主对角线 69 | sum = 0; 70 | for(i = 0,j = 0;i < m;i++,j++) 71 | { 72 | sum += a[i][j]; 73 | } 74 | num[n++] = sum; 75 | //副对角线 76 | sum = 0; 77 | for(i = 0,j = m - 1;i < m;i++,j--) 78 | { 79 | sum += a[i][j]; 80 | } 81 | num[n++] = sum; 82 | sort(num,num+n,cmp); 83 | for(i = 0;i < n;i++) 84 | cout << num[i] << " "; 85 | cout << endl; 86 | } 87 | return 0; 88 | } 89 | -------------------------------------------------------------------------------- /10.3图的遍历/1908.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 1000010; 5 | vector adj[maxn]; 6 | int n = 0; 7 | int result = 0; 8 | bool vis[maxn] = {false}; 9 | //判断这个节点是否存在 10 | bool is_exist[maxn] = {false}; 11 | void dfs(int u,int depth) 12 | { 13 | vis[u] = true; 14 | for(int i = 0;i < adj[u].size();i++) 15 | { 16 | int v = adj[u][i]; 17 | if(vis[v] == false) 18 | { 19 | dfs(v,depth + 1); 20 | } 21 | } 22 | } 23 | void dfs_traver() 24 | { 25 | for(int u = 0;u <= n;u++) 26 | { 27 | //节点u存在并且未被访问 28 | if(vis[u] == false && is_exist[u]) 29 | { 30 | dfs(u,1); 31 | result++; 32 | } 33 | } 34 | } 35 | int main() 36 | { 37 | int n_,m,a,b; 38 | while(cin >> n_ >> m) 39 | { 40 | if(n_ == 0 && m == 0) 41 | break; 42 | else 43 | { 44 | result = 0; 45 | for(int i = 0;i < maxn;i++) 46 | { 47 | adj[i].clear(); 48 | vis[i] = false; 49 | is_exist[i] = false; 50 | } 51 | for(int i = 0;i < m;i++) 52 | { 53 | cin >> a >> b; 54 | if(a > n) n = a; 55 | if(b > n) n = b; 56 | adj[a].push_back(b); 57 | adj[b].push_back(a); 58 | is_exist[a] = true; 59 | is_exist[b] = true; 60 | } 61 | dfs_traver(); 62 | int count_ = 0; 63 | for(int i = 0;i < maxn;i++) 64 | { 65 | if(is_exist[i]) 66 | count_++; 67 | } 68 | if(result == 1 && count_ == n_) 69 | cout << "YES" << endl; 70 | else 71 | cout << "NO" << endl; 72 | } 73 | } 74 | return 0; 75 | } 76 | -------------------------------------------------------------------------------- /5.6大整数运算/1922.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #define MAX 110 5 | using namespace std; 6 | int a1[MAX],a2[MAX],b1[MAX],b2[MAX]; 7 | 8 | string a,b; 9 | int main(){ 10 | int m; 11 | while(scanf("%d",&m) != EOF){ 12 | while(m-- > 0){ 13 | cin >> a >> b; 14 | int pos1 = a.find('.'); 15 | int pos2 = b.find('.'); 16 | 17 | int a1_size = 0; 18 | for(int i = pos1-1;i >= 0;i--){ 19 | a1[a1_size++] = a[i]-'0'; 20 | } 21 | int b1_size = 0; 22 | for(int i = pos2-1;i >= 0;i--){ 23 | b1[b1_size++] = b[i]-'0'; 24 | } 25 | int a2_size = 0; 26 | for(int i = pos1 + 1;i < a.size();i++){ 27 | a2[a2_size++] = a[i]-'0'; 28 | } 29 | int b2_size = 0; 30 | for(int i = pos2+1;i < b.size();i++){ 31 | b2[b2_size++] = b[i]-'0'; 32 | } 33 | 34 | int maxd,maxi,carry=0; 35 | if(a2_size >= b2_size){ 36 | maxd = a2_size; 37 | } else{ 38 | maxd = b2_size; 39 | } 40 | for(int i = maxd - 1;i >= 0;i--){ 41 | int temp = a2[i] + b2[i] + carry; 42 | a2[i] = temp % 10; 43 | carry = temp / 10; 44 | } 45 | int real_max = maxd; 46 | for(int i = maxd-1;i >= 0;i--){ 47 | if(a2[i] == 0){ 48 | real_max--; 49 | }else{ 50 | break; 51 | } 52 | } 53 | if(a1_size >= b1_size){ 54 | maxi = a1_size; 55 | }else{ 56 | maxi = b1_size; 57 | } 58 | 59 | for(int i = 0;i < maxi;i++){ 60 | int temp = a1[i] + b1[i] + carry; 61 | a1[i] = temp % 10; 62 | carry = temp / 10; 63 | } 64 | if(carry != 0){ 65 | a1[maxi++] = carry; 66 | } 67 | 68 | for(int i = maxi - 1;i >= 0;i--){ 69 | cout << a1[i]; 70 | } 71 | cout << "."; 72 | 73 | for(int i = 0;i < real_max;i++){ 74 | cout << a2[i]; 75 | } 76 | cout << endl; 77 | memset(a1,0,sizeof(a1)); 78 | memset(a2,0,sizeof(a2)); 79 | memset(b1,0,sizeof(b1)); 80 | memset(b2,0,sizeof(b2)); 81 | } 82 | } 83 | return 0; 84 | } 85 | -------------------------------------------------------------------------------- /13.1分块思想/1110.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int maxn = 40010; 4 | int table[maxn]; 5 | int table100[maxn]; 6 | int main() 7 | { 8 | int t; 9 | cin >> t; 10 | for(int i = 0;i < t;i++) 11 | { 12 | cout << "Case " << i + 1 << ":" << endl; 13 | fill(table,table + maxn,0); 14 | fill(table100,table100 + maxn,0); 15 | int n; 16 | cin >> n; 17 | int temp; 18 | for(int j = 1;j <= n;j++) 19 | { 20 | cin >> temp; 21 | table[j] = temp; 22 | table100[j / 100] += temp; 23 | } 24 | string s; 25 | int a,b; 26 | while(cin >> s && s != "End") 27 | { 28 | cin >> a >> b; 29 | if(s == "Query") 30 | { 31 | int sum = 0; 32 | if(b - a <= 200) 33 | { 34 | for(int j = a;j <= b;j++) 35 | { 36 | sum += table[j]; 37 | } 38 | } 39 | else 40 | { 41 | //a和b中间的几个100 42 | for (int j = a / 100 + 1; j < b / 100; j++) 43 | sum += table100[j]; 44 | //a左边的部分 45 | for (int j = a; j <= (a / 100) * 100 + 99; j++) 46 | sum += table[j]; 47 | //a右边的部分 48 | for (int j = (b / 100) * 100; j <= b; j++) 49 | sum += table[j]; 50 | } 51 | cout << sum << endl; 52 | } 53 | else if(s == "Add") 54 | { 55 | table[a] += b; 56 | table100[a/100] += b; 57 | } 58 | else if(s == "Sub") 59 | { 60 | table[a] -= b; 61 | table100[a/100] -= b; 62 | } 63 | } 64 | } 65 | return 0; 66 | } 67 | -------------------------------------------------------------------------------- /13.2树状数组/1110.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | const int maxn = 40010; 4 | int table[maxn]; 5 | int table100[maxn]; 6 | int main() 7 | { 8 | int t; 9 | cin >> t; 10 | for(int i = 0;i < t;i++) 11 | { 12 | cout << "Case " << i + 1 << ":" << endl; 13 | fill(table,table + maxn,0); 14 | fill(table100,table100 + maxn,0); 15 | int n; 16 | cin >> n; 17 | int temp; 18 | for(int j = 1;j <= n;j++) 19 | { 20 | cin >> temp; 21 | table[j] = temp; 22 | table100[j / 100] += temp; 23 | } 24 | string s; 25 | int a,b; 26 | while(cin >> s && s != "End") 27 | { 28 | cin >> a >> b; 29 | if(s == "Query") 30 | { 31 | int sum = 0; 32 | if(b - a <= 200) 33 | { 34 | for(int j = a;j <= b;j++) 35 | { 36 | sum += table[j]; 37 | } 38 | } 39 | else 40 | { 41 | //a和b中间的几个100 42 | for (int j = a / 100 + 1; j < b / 100; j++) 43 | sum += table100[j]; 44 | //a左边的部分 45 | for (int j = a; j <= (a / 100) * 100 + 99; j++) 46 | sum += table[j]; 47 | //a右边的部分 48 | for (int j = (b / 100) * 100; j <= b; j++) 49 | sum += table[j]; 50 | } 51 | cout << sum << endl; 52 | } 53 | else if(s == "Add") 54 | { 55 | table[a] += b; 56 | table100[a/100] += b; 57 | } 58 | else if(s == "Sub") 59 | { 60 | table[a] -= b; 61 | table100[a/100] -= b; 62 | } 63 | } 64 | } 65 | return 0; 66 | } 67 | -------------------------------------------------------------------------------- /3.1简单模拟/6172(2).cpp: -------------------------------------------------------------------------------- 1 | //right 2 | #include 3 | char most_gesture(int j, int c, int b); 4 | int main(int argc, const char * argv[]) { 5 | int n, i, jia_sheng=0, jia_ping=0, jia_j=0, jia_c=0, jia_b=0, yi_sheng=0, yi_j=0, yi_c=0, yi_b=0; 6 | char jia, yi; 7 | char jia_zui, yi_zui; 8 | scanf("%d", &n); 9 | for(i=0; ic){ 44 | if(j>b){ 45 | return 'J'; 46 | } 47 | else{ 48 | return 'B'; 49 | } 50 | } 51 | else if(j==c){ 52 | if(j>b){ 53 | return 'C'; 54 | } 55 | else{ 56 | return 'B'; 57 | } 58 | } 59 | else{ 60 | if(c<=b){ 61 | return 'B'; 62 | } 63 | else{ 64 | return 'C'; 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /11.8 动态规划总结/1916.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 110; 5 | int a[maxn],aleft[maxn],aright_[maxn],aright[maxn]; 6 | int dp_left[maxn],dp_right[maxn]; 7 | int main() 8 | { 9 | int n,result = 0; 10 | while(cin >> n && n != 0) 11 | { 12 | fill(a,a + maxn,0); 13 | for(int i = 1;i <= n;i++) 14 | cin >> a[i]; 15 | for(int i = 1;i <= n;i++) 16 | { 17 | int r_left = -1,r_right = -1; 18 | int k1 = 1,k2 = 1; 19 | for(int j = 1;j <= i;j++) 20 | { 21 | aleft[k1++] = a[j]; 22 | } 23 | for(int j = i;j <= n;j++) 24 | { 25 | aright_[k2++] = a[j]; 26 | } 27 | int k3 = 1; 28 | for(int j = k2 - 1;j >= 1;j--) 29 | { 30 | aright[k3++] = aright_[j]; 31 | } 32 | for(int j = 1;j <= k1 - 1;j++) 33 | { 34 | dp_left[j] = 1; 35 | for(int l = 1;l < j;l++) 36 | { 37 | if(aleft[j] > aleft[l] && dp_left[l] + 1 > dp_left[j]) 38 | dp_left[j] = dp_left[l] + 1; 39 | } 40 | r_left = max(r_left,dp_left[j]); 41 | } 42 | for(int j = 1;j <= k3 - 1;j++) 43 | { 44 | dp_right[j] = 1; 45 | for(int l = 1;l < j;l++) 46 | { 47 | if(aright[j] > aright[l] && dp_right[l] + 1 > dp_right[j]) 48 | dp_right[j] = dp_right[l] + 1; 49 | } 50 | r_right = max(r_right,dp_right[j]); 51 | } 52 | fill(aleft,aleft + maxn,0); 53 | fill(aright,aright + maxn,0); 54 | if(r_left + r_right - 1 > result) 55 | { 56 | result = r_left + r_right - 1; 57 | } 58 | } 59 | cout << n - result << endl; 60 | } 61 | return 0; 62 | } 63 | -------------------------------------------------------------------------------- /4.2哈希/2066.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | using namespace std; 7 | //开大数组最好开成全局变量,可以有效规避内存溢出的问题。开成局部变量,存放在栈区,栈区内存太少容易溢出 8 | int result[2000][2000]; 9 | int main() 10 | { 11 | int m; 12 | cin >> m; 13 | while(m--){ 14 | int n; 15 | seta_; 16 | setb_; 17 | vector a,a2; 18 | vector b,b2; 19 | cin >> n; 20 | for(int i = 0;i < n;i++) 21 | { 22 | int temp; 23 | cin >> temp; 24 | a.push_back(temp); 25 | } 26 | for(int j = 0;j < n;j++) 27 | { 28 | int temp2; 29 | cin >> temp2; 30 | b.push_back(temp2); 31 | } 32 | //用result记录每个数在对应分组的数目 33 | for(int i = 0;i < n;i++){ 34 | result[b[i]][a[i]]++; 35 | } 36 | //用set记录数和分组,进行去重和排序 37 | for(int i = 0;i < n;i++){ 38 | a_.insert(a[i]); 39 | } 40 | for(int i = 0;i < n;i++){ 41 | b_.insert(b[i]); 42 | } 43 | //将set的值存入vector,方便循环,因为set只能迭代器循环 44 | set::iterator it;; 45 | for(it = a_.begin();it != a_.end();it++){ 46 | a2.push_back(*(it)); 47 | } 48 | for(it = b_.begin();it != b_.end();it++){ 49 | b2.push_back(*(it)); 50 | } 51 | //按格式输出result数组 52 | for(int i = 0;i < b2.size();i++){ 53 | cout << b2[i] << "={"; 54 | for(int j = 0;j < a2.size();j++){ 55 | cout << a2[j] << "=" << result[b2[i]][a2[j]]; 56 | if(j != a2.size() - 1) 57 | cout << ","; 58 | else if(j == a2.size() - 1) 59 | cout << "}"; 60 | } 61 | cout << endl; 62 | } 63 | a.clear(); 64 | b.clear(); 65 | a_.clear(); 66 | b_.clear(); 67 | a2.clear(); 68 | b2.clear(); 69 | memset(result, 0, sizeof(result)); 70 | } 71 | return 0; 72 | } 73 | -------------------------------------------------------------------------------- /3.4日期处理/1928.cpp: -------------------------------------------------------------------------------- 1 | //计算到1年1月1日的天数,然后相减加1 2 | #include 3 | #include 4 | int dayOfMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 5 | int isLeapYear(int year) 6 | { 7 | if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) 8 | return 1; 9 | else 10 | return 0; 11 | } 12 | int main() 13 | { 14 | int date1,date2; 15 | while(scanf("%d %d",&date1,&date2) != EOF){ 16 | int year1 = date1 / 10000; 17 | int year2 = date2 / 10000; 18 | int month1 = date1 / 100 % 100; 19 | int month2 = date2 / 100 % 100; 20 | int day1 = date1 % 100; 21 | int day2 = date2 % 100; 22 | int sum1 = 0,sum2 = 0,result; 23 | for(int i = 1;i < year1;i++){ 24 | if(isLeapYear(i) == 1) 25 | sum1 += 366; 26 | else if(isLeapYear(i) == 0) 27 | sum1 += 365; 28 | } 29 | for(int j = 1;j < year2;j++){ 30 | if(isLeapYear(j) == 1) 31 | sum2 += 366; 32 | else if(isLeapYear(j) == 0) 33 | sum2 += 365; 34 | } 35 | if(isLeapYear(year1) == 0){ 36 | for(int i = 1;i < month1;i++) 37 | sum1 += dayOfMonth[i]; 38 | } 39 | else if(isLeapYear(year1) == 1){ 40 | for(int i = 1;i < month1;i++) 41 | sum1 += dayOfMonth[i]; 42 | if(month1 > 2) 43 | sum1 += 1; 44 | } 45 | if(isLeapYear(year2) == 0){ 46 | for(int i = 1;i < month2;i++) 47 | sum2 += dayOfMonth[i]; 48 | } 49 | else if(isLeapYear(year2) == 1){ 50 | for(int i = 1;i < month2;i++) 51 | sum2 += dayOfMonth[i]; 52 | if(month2 > 2) 53 | sum2 += 1; 54 | } 55 | sum1 += day1; 56 | sum2 += day2; 57 | if(sum1 < sum2){ 58 | int temp = sum1; 59 | sum1 = sum2; 60 | sum2 = temp; 61 | } 62 | result = sum1 - sum2 + 1; 63 | printf("%d\n",result); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /6.7stack常见用法/1982.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | stack symbol; 6 | int main() 7 | { 8 | int n; 9 | while(scanf("%d",&n) != EOF){ 10 | for(int i = 0;i < n;i++){ 11 | string s; 12 | cin >> s; 13 | bool result; 14 | while(!symbol.empty()) 15 | symbol.pop(); 16 | for(int j = 0;j < s.length();j++){ 17 | if(s[j] == '(' || s[j] == '[' || s[j] == '{'){ 18 | symbol.push(s[j]); 19 | } 20 | else if(s[j] == ')' && !symbol.empty()){ 21 | if(symbol.top() == '('){ 22 | symbol.pop(); 23 | result = true; 24 | } 25 | else if(symbol.top() != '('){ 26 | result = false; 27 | break; 28 | } 29 | } 30 | else if(s[j] == ']' && !symbol.empty()){ 31 | if(symbol.top() == '['){ 32 | symbol.pop(); 33 | result = true; 34 | } 35 | else if(symbol.top() != '['){ 36 | result = false; 37 | break; 38 | } 39 | } 40 | else if(s[j] == '}' && !symbol.empty()){ 41 | if(symbol.top() == '{'){ 42 | symbol.pop(); 43 | result = true; 44 | } 45 | else if(symbol.top() != '{'){ 46 | result = false; 47 | break; 48 | } 49 | } 50 | else if((s[i] == '}' || s[i] == ']' || s[i] == ')') && symbol.empty()) 51 | result = false; 52 | } 53 | if(result) 54 | printf("yes\n"); 55 | else if(!result) 56 | printf("no\n"); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /10.6拓扑排序/1767.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | using namespace std; 7 | const int maxn = 110; 8 | vector g[maxn]; 9 | vector result; 10 | int n, m, in_degree[maxn]; 11 | bool topo_logical_sort() 12 | { 13 | int num = 0; 14 | stack q; 15 | //queue q; 16 | for (int i = 0; i < n; i++) 17 | { 18 | if (in_degree[i] == 0) 19 | { 20 | q.push(i); 21 | } 22 | } 23 | /*while(!q_temp.empty()) 24 | { 25 | int t = q_temp.top(); 26 | q.push(t); 27 | q_temp.pop(); 28 | }*/ 29 | while (!q.empty()) 30 | { 31 | int u = q.top(); 32 | result.push_back(u); 33 | q.pop(); 34 | for (int i = 0; i < g[u].size(); i++) 35 | { 36 | int v = g[u][i]; 37 | in_degree[v]--; 38 | //cout << in_degree[v] << endl; 39 | if (in_degree[v] == 0) 40 | q.push(v); 41 | } 42 | num++; 43 | } 44 | if (num == n) 45 | return true; 46 | return false; 47 | } 48 | int main() 49 | { 50 | while (cin >> n) 51 | { 52 | fill(in_degree, in_degree + maxn, 0); 53 | result.clear(); 54 | for (int i = 0; i < maxn; i++) 55 | { 56 | g[i].clear(); 57 | } 58 | int temp; 59 | for (int i = 0; i < n; i++) 60 | { 61 | for (int j = 0; j < n; j++) 62 | { 63 | cin >> temp; 64 | if (temp == 1 && i != j) 65 | { 66 | in_degree[j]++; 67 | g[i].push_back(j); 68 | } 69 | } 70 | } 71 | 72 | //topo_logical_sort返回true,拓扑排序成功,没有回路 73 | if (topo_logical_sort()) 74 | { 75 | for (vector::iterator it = result.begin();it!=result.end();it++) 76 | cout << *it << " "; 77 | cout << endl; 78 | } 79 | //有回路 80 | else 81 | cout << "ERROR" << endl; 82 | } 83 | return 0; 84 | } 85 | -------------------------------------------------------------------------------- /10.4最短路径/1956.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | using namespace std; 5 | const int maxn = 150; 6 | const int inf = 0x3fffffff; 7 | int n,m, g[maxn][maxn]; 8 | int d[maxn],f[maxn]; 9 | bool vis[maxn] = { false }; 10 | int mod(int x, int y) 11 | { 12 | int num = 1; 13 | while (y--) 14 | { 15 | num = (num * x) % 100000; 16 | } 17 | return num; 18 | } 19 | int find(int x) 20 | { 21 | while (x != f[x]) 22 | x = f[x]; 23 | return x; 24 | } 25 | void dijkstra(int s) 26 | { 27 | fill(d, d + maxn, inf); 28 | fill(vis, vis + maxn, false); 29 | d[s] = 0; 30 | for (int i = 0; i < n; i++) 31 | { 32 | int u = -1, min_ = inf; 33 | for (int j = 0; j < n; j++) 34 | { 35 | if (vis[j] == false && d[j] < min_) 36 | { 37 | u = j; 38 | min_ = d[j]; 39 | } 40 | } 41 | if (u == -1) 42 | return; 43 | vis[u] = true; 44 | for (int v = 0; v < n; v++) 45 | { 46 | if (vis[v] == false && g[u][v] != inf && d[u] + g[u][v] < d[v]) 47 | { 48 | d[v] = d[u] + g[u][v]; 49 | } 50 | } 51 | } 52 | } 53 | int main() 54 | { 55 | while (cin >> n >> m) 56 | { 57 | for (int i = 0; i < maxn; i++) 58 | { 59 | f[i] = i; 60 | } 61 | fill(g[0], g[0] + maxn * maxn, inf); 62 | for (int i = 0; i < m; i++) 63 | { 64 | int a, b; 65 | cin >> a >> b; 66 | //要保证下一个路径比前面的路径加起来都大 67 | int fa = find(f[a]), fb = find(f[b]); 68 | if (fa != fb) 69 | f[fa] = fb; 70 | else 71 | continue; 72 | int len = mod(2,i); 73 | g[a][b] = len; 74 | g[b][a] = len; 75 | } 76 | dijkstra(0); 77 | for (int i = 1; i < n; i++) 78 | { 79 | if (d[i] == inf) 80 | cout << "-1" << endl; 81 | else 82 | cout << d[i] % 100000 << endl; 83 | } 84 | } 85 | return 0; 86 | } -------------------------------------------------------------------------------- /10.4最短路径/1988.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | const int maxn = 1100; 5 | const int inf = 0x3fffffff; 6 | //n 顶点数 d 起点到各点的最短路径 7 | int n, m, g[maxn][maxn]; 8 | int d[maxn]; 9 | int c[maxn]; 10 | int a, b, e, f; 11 | int s, t; 12 | int cost[maxn][maxn]; 13 | bool vis[maxn] = { false }; 14 | void dijkstra(int s) 15 | { 16 | fill(d, d + maxn, inf); 17 | d[s] = 0; 18 | c[s] = 0; 19 | for (int i = 0; i < n; i++) 20 | { 21 | int u = -1, min_ = inf; 22 | for (int j = 1; j <= n; j++) 23 | { 24 | if (vis[j] == false && d[j] < min_) 25 | { 26 | u = j; 27 | min_ = d[j]; 28 | } 29 | } 30 | if (u == -1) 31 | return; 32 | vis[u] = true; 33 | for (int v = 1; v <= n; v++) 34 | { 35 | if (vis[v] == false && g[u][v] != inf) 36 | { 37 | if (d[u] + g[u][v] < d[v]) 38 | { 39 | d[v] = d[u] + g[u][v]; 40 | c[v] = c[u] + cost[u][v]; 41 | } 42 | else if (d[u] + g[u][v] == d[v] && c[u] + cost[u][v] < c[v]) 43 | { 44 | c[v] = c[u] + cost[u][v]; 45 | } 46 | } 47 | } 48 | } 49 | } 50 | int main() 51 | { 52 | while (cin >> n >> m) 53 | { 54 | if (m != 0 && n != 0) 55 | { 56 | fill(g[0], g[0] + maxn * maxn, inf); 57 | fill(cost[0], cost[0] + maxn * maxn, inf); 58 | fill(c, c + maxn, inf); 59 | fill(vis, vis + maxn, false); 60 | for (int i = 0; i < m; i++) 61 | { 62 | cin >> a >> b >> e >> f; 63 | g[a][b] = e; 64 | g[b][a] = e; 65 | cost[a][b] = f; 66 | cost[b][a] = f; 67 | } 68 | cin >> s >> t; 69 | dijkstra(s); 70 | cout << d[t] << " " << c[t]; 71 | cout << endl; 72 | } 73 | else 74 | { 75 | break; 76 | } 77 | } 78 | return 0; 79 | } 80 | -------------------------------------------------------------------------------- /7.3链表/2453.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace std; 4 | struct node{ 5 | int data; 6 | node* next; 7 | }; 8 | node* create(int n) 9 | { 10 | node *head,*p,*end; 11 | head = new node; 12 | end = new node; 13 | head -> next = NULL; 14 | end = head; 15 | for(int i = 0;i < n;i++){ 16 | p = new node; 17 | scanf("%d",&(p -> data)); 18 | end -> next = p; 19 | end = p; 20 | } 21 | end -> next = NULL; 22 | return head; 23 | } 24 | void show(node* head) 25 | { 26 | node* p = head; 27 | p = p -> next; 28 | while(p != NULL){ 29 | printf("%d ",p -> data); 30 | p = p -> next; 31 | } 32 | cout << endl; 33 | } 34 | void insert(node* head,int num) 35 | { 36 | node* p = head; 37 | node* q = p -> next; 38 | while(q != NULL){ 39 | //如果num小于某个节点,就插到这个节点前面 40 | if(num < q -> data){ 41 | node* n = new node; 42 | n -> data = num; 43 | n -> next = p -> next; 44 | p -> next = n; 45 | break; 46 | } 47 | //num大于最后一位,就插到最后一位的后面 48 | else if(q -> next == NULL && q -> data <= num){ 49 | node* n = new node; 50 | n -> data = num; 51 | q -> next = n; 52 | n -> next = NULL; 53 | break; 54 | } 55 | p = p -> next; 56 | q = q -> next; 57 | } 58 | } 59 | void find(node* head,int num) 60 | { 61 | node* p = head; 62 | node* p2 = head; 63 | p = p -> next; 64 | p2 = p2 -> next; 65 | while(p != NULL){ 66 | if(p -> data == num){ 67 | if(p -> next != NULL){ 68 | node* q = p -> next; 69 | int temp = q -> data; 70 | q -> data = p -> data; 71 | p -> data = temp; 72 | break; 73 | } 74 | } 75 | p = p -> next; 76 | } 77 | if(p == NULL){ 78 | printf("no\n"); 79 | insert(head,num); 80 | } 81 | } 82 | int main() 83 | { 84 | int num; 85 | int m; 86 | scanf("%d %d",&num,&m); 87 | node* L = create(m); 88 | find(L,num); 89 | show(L); 90 | return 0; 91 | } 92 | --------------------------------------------------------------------------------