“ Ctrl AC!一起 AC!”

题目集合链接:HDU2000-2099http://acm.hdu.edu.cn/listproblem.php?vol=11

前言

1. 好像没有HDU2038 呜呜呜

2. 主要是整合提供了AC的代码,思路不太详细qwq

目录

1. ASCII码排序(HDU2000)

2. 计算两点间的距离(HDU2001)

3. 计算球体积(HDU2002)

4. 求绝对值(HDU2003)

5. 成绩转换(HDU2004)

6. 第几天?(HDU2005)

7. 求奇数的乘积(HDU2006)

8. 平方和与立方和(HDU2007)

9. 数值统计(HDU2008)

10. 求数列的和(HDU2009)

11. 水仙花数(HDU2010)

12. 多项式求和(HDU2011)

13. 素数判定(HDU2012)

14. 蟠桃记(HDU2013)

15. 青年歌手大奖赛_评委会打分(HDU2014)

16. 偶数求和(HDU2015)

17. 数据的交换输出(HDU2016)

18. 字符串统计(HDU2017)

19. 母牛的故事(HDU2018)

20. 数列有序!(HDU2019)

21. 绝对值排序(HDU2020)

22. 发工资咯:)(HDU2021)

23. 海选女主角(HDU2022)

24. 求平均成绩(HDU2023)

25. C语言合法标识符(HDU2024)

26. 查找最大元素(HDU2025)

27. 首字母变大写(HDU2026)

28. 统计元音(HDU2027)

29. Lowest Common Multiple Plus(HDU2028)

30. Palindromes _easy version(HDU2029)

31. 汉字统计(HDU2030)

32. 进制转换(HDU2031)

33. 杨辉三角(HDU2032)

34. 人见人爱A+B(HDU2033)

35. 人见人爱A-B(HDU2034)

36. 人见人爱A^B(HDU2035)

37. 改革春风吹满地(HDU2036)

38. 今年暑假不AC(HDU2037)

39. 三角形(HDU2039)

40. 亲和数(HDU2040)

41. 超级楼梯(HDU2041)

42. 不容易系列之二(HDU2042)

43. 密码(HDU2043)

44. 一只小蜜蜂...(HDU2044)

45. 不容易系列之(3)―― LELE的RPG难题(HDU2045)

46. 骨牌铺方格(HDU2046)

47. 阿牛的EOF牛肉串(HDU2047)

48. 神、上帝以及老天爷(HDU2048)

49. 不容易系列之(4)――考新郎(HDU2049)

50. 折线分割平面(HDU2050)

51. Bitset(HDU2051)

52. Picture(HDU2052)

53. Switch Game(HDU2053)

54. A == B ?(HDU2054)

55. An easy problem(HDU2055)

56. Rectangles(HDU2056)

57. A + B Again(HDU2057)

58. The sum problem(HDU2058)

59. 龟兔赛跑(HDU2059)

60. Snooker(HDU2060)

61. Treasure the new start, freshmen!(HDU2061)

62. Subset sequence(HDU2062)

63. 过山车(HDU2063)

64. 汉诺塔III(HDU2064)

65. "红色病毒"问题(HDU2065)

66. 一个人的旅行(HDU2066)

67. 小兔的棋盘(HDU2067)

68. RPG的错排(HDU2068)

69. Coin Change(HDU2069)

70. Fibbonacci Number(HDU70)

71. Max Num(HDU2071)

72. 单词数(HDU2072)

73. 无限的路(HDU2073)

74. 叠筐(HDU2074)

75. A|B?(HDU2075)

76. 夹角有多大(题目已修改,注意读题)(HDU2076)

77. 汉诺塔IV(HDU2077)

78. 复习时间(HDU2078)

79. 选课时间(HDU2079)

80. 夹角有多大II(HDU2080)

81. 手机短号(HDU2081)

82. 找单词(HDU2082)

83. 简易版之最短距离(HDU2083)

84. 数塔(HDU2084)

85. 核反应堆(HDU2085)

86. A1 = ?(HDU2086)

87. 剪花布条(HDU2087)

88. Box of Bricks(HDU2088)

89. 不要62(HDU2089)

90. 算菜价(HDU2090)

91. 空心三角形(HDU2091)

92. 整数解(HDU2092)

93. 考试排名(HDU2093)

94. 产生冠军(HDU2094)

95. find your present (2)(HDU2095)

96. 小明A+B(HDU2096)

97. Sky数(HDU2097)

98. 分拆素数和(HDU2098)

99. 整除的尾数(HDU2099)


1. ASCII码排序(HDU2000)

思路:冒泡排序,如果前面的字母大于后面的字母 就交换

代码:

#include <cstdio>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){char a[5];while(cin>>a){//冒泡排序:for(int i=0;i<3;i++){for(int j=i;j<3;j++){if(a[i]>a[j]){ //交换int m=a[i];a[i]=a[j];a[j]=m;}}}for(int i=0;i<3;i++){if(i!=2) cout<<a[i]<<' ';else cout<<a[i];}cout<<endl;}return 0;
}

2. 计算两点间的距离(HDU2001)

思路:两点间的距离公式

代码:

#include <iostream>
#include<string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int main(){double a,b,c,d;while(cin>>a>>b>>c>>d){double k=sqrt((a-c)*(a-c)+(b-d)*(b-d));printf("%.2lf\n",k);}return 0;
}

3. 计算球体积(HDU2002)

思路:球体积的计算公式,注意PI的精度要够高

代码:

#include <cstdio>
#include <string.h>
#include <iostream>
#include <algorithm>
#define PI 3.1415927
using namespace std;
int main(){double n;while(cin>>n){double v=(4*PI*n*n*n)/3;printf("%.3lf\n",v);}return 0;
}

4. 求绝对值(HDU2003)

思路:fabs()求浮点数的绝对值(或直接判断改变正负)

代码:

#include <cstdio>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#define PI 3.1415927
using namespace std;
int main(){double n;while(cin>>n){double k=fabs(n);printf("%.2lf\n",k);}return 0;
}

5. 成绩转换(HDU2004)

思路:if else 的使用

代码:

#include <cstdio>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>using namespace std;
int main(){int n;while(cin>>n){if(n>=90&&n<=100){cout<<"A"<<endl;}else if(n>=80&&n<=89){cout<<"B"<<endl;}else if(n>=70&&n<=79){cout<<"C"<<endl;}else if(n>=60&&n<=69){cout<<"D"<<endl;}else if(n>=0&&n<=59){cout<<"E"<<endl;}else{cout<<"Score is error!"<<endl;}}return 0;
}

6. 第几天?(HDU2005)

思路:先用一个数组存放每个月的天数,再用sum逐月逐日增加天数,若是闰年则需特殊处理二月

注意scanf输入格式!!!

代码:

#include<stdio.h>
int main()
{int num[12]= {31,28,31,30,31,30,31,31,30,31,30,31};int year,month,day,sum;while(scanf("%d/%d/%d",&year,&month,&day)!=EOF){sum=0;if((year%4==0&&year%100!=0)||year%400==0) //是闰年{for(int i = 0; i < month-1; i++) //数组下标从 零 开始,但是月份从 一 开始{if(i==1){sum = sum + 29; //二月变成29天}else{sum = sum + num[i];}}sum = sum + day;printf("%d\n",sum);}else{for(int i = 0; i < month-1; i++){sum = sum + num[i];}sum = sum + day;printf("%d\n",sum);}}return 0;
}

7. 求奇数的乘积(HDU2006)

思路:判断奇数:如果某个数是奇数,则其二进制最低一位是1

代码:

#include<iostream>
using namespace std;
int main() {int n;while (cin >> n) {int ans = 1;for (int i = 0; i < n; i++) {int num; cin >> num;if (num & 1) ans *= num;}cout << ans << endl;}return 0;
}

8. 平方和与立方和(HDU2007)

思路:遍历判断奇偶

代码:

#include<iostream>
#include<cstdio>
using namespace std;
int main() {int m, n;while ((scanf("%d %d", &m, &n) != EOF)) {if(n<m) swap(m,n);long long ans1 = 0, ans2 = 0;for (long long i = m; i <= n; i++) {if (i & 1) ans2 += (i * i * i);else ans1 += (i * i);}cout << ans1 << " " << ans2 << endl;}return 0;
}

9. 数值统计(HDU2008)

思路:判断正负

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int n;while (cin >> n && n) {int a = 0, b = 0, c = 0;while (n--) {float num; cin >> num;if (num < 0) a++;else if (num == 0) b++;else c++;}cout << a << ' ' << b << ' ' << c << endl;}return 0;
}

10. 求数列的和(HDU2009)

思路:将数列的第一项n 不断开平方根,同时ans不断加上n

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {double n, m;while (cin >> n >> m) {double ans = 0.0;while (m--) {ans += n;n = sqrt(n);}cout << fixed << setprecision(2) << ans << endl;}return 0;
}

11. 水仙花数(HDU2010)

思路:数的分解,将数的每一位分解出来,再开三次方。(详见代码)

代码:

#include<bits/stdc++.h>
using namespace std;
bool ishua(int num) {// %10表示各位,/10%10表示十位...if (num == (pow(num % 10, 3) + pow(num / 10 % 10, 3) + pow(num / 100 % 10, 3))) return true;else return false;
}
int main() {int m, n;while (cin >> m >> n) {//因格式要求,flag用来判断是否是第一个遇见的水仙花数,来控制空格的输出//同时flag用来判断有没有遇见过水仙花数,来控制“no”的输出int flag = false;for (int i = m; i <= n; i++) {if (ishua(i)) {if (!flag) {cout << i; flag = true;}else {cout << " " << i;}}}if (!flag) cout << "no" << endl;else cout<<endl;  //记得换行}return 0;
}

12. 多项式求和(HDU2011)

思路:模拟多项式,通过i的奇偶判断加减

代码:

#include<bits/stdc++.h>
using namespace std;
double f(int n) {double ans = 0.0;double first = 1;for (int i = 1; i <= n; i++) {if (i & 1) ans += (first / i);else ans -= (first / i);}return ans;
}
int main() {int t; cin >> t;while (t--) {int n; cin >> n;cout << fixed << setprecision(2) << f(n) << endl;}return 0;
}

13. 素数判定(HDU2012)

思路:判断素数:首先1不是素数,2是素数。然后遍历2到sqrt(num),如果num能整除其中的某一个数,那么它就不是素数。否则是素数。

代码:

#include<bits/stdc++.h>
using namespace std;
bool isprime(int num) {if (num == 1) return false;if (num == 2) return true;for (int i = 2; i <= sqrt(num); i++) {if (num % i == 0) return false;}return true;
}
bool ok(int x, int y) {for (int i = x; i <= y; i++) {int ans = i * i + i + 41;if (!isprime(ans)) return false;}return true;
}
int main() {int x, y;while (cin >> x >> y &&(x||y)) {if (ok(x, y)) cout << "OK" << endl;else cout << "Sorry" << endl;}return 0;
}

14. 蟠桃记(HDU2013)

思路:这道题要逆着推答案,最后一天有1个桃子,那么倒数第二天有(1+1)*2个桃子,倒数第三天有((1+1)*2+1)*2个桃子。循环n-1次,因为第一天到第n-1天才吃了桃子,第n天没有吃桃子,只是告诉了我们那天的桃子个数。

代码:

#include<bits/stdc++.h>
using namespace std;
int f(int n) {int ans = 1;for (int i = 2; i <= n; i++) {ans = (ans + 1) * 2;}return ans;
}
int main() {int n; while (cin >> n) {cout << f(n) << endl;}return 0;
}

15. 青年歌手大奖赛_评委会打分(HDU2014)

思路:找到最大最小值,减去再除n-2

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int n;while (cin >> n) {double sum = 0, maxx = -1, minn = 0x3f3f3f3f;for (int i = 0; i < n; i++) {double num; cin >> num;sum += num;if (num > maxx) maxx = num;if (num < minn) minn = num;}cout << fixed << setprecision(2) << (sum - maxx - minn) / (n - 2) << endl;}return 0;
}

16. 偶数求和(HDU2015)

思路:设一个计数器k,每次sum加数的时候,k++,k加到m的时候输出阶段性答案(注意空格处理),然后k归零。最后判断k是否大于零,以判断是否存在最后的剩余项

代码:

#include<bits/stdc++.h>
using namespace std;
void f(int n, int m) {int sum = 0, k = 0;for (int i = 2; i <= 2 * n; i += 2) {sum += i; k++;if (k == m) {//空格处理if(i==2*n) cout<<sum/m;else cout << sum / m << " ";sum = 0;k = 0;}}if (k > 0) {cout << sum / k ;}
}
int main() {int n, m;while (cin >> n >> m) {f(n, m);cout << endl;}return 0;
}

17. 数据的交换输出(HDU2016)

思路:找到最小的数,记录它的下标,最后与第一个数交换即可

代码:

#include<bits/stdc++.h>
using namespace std;
int num[105];
int main() {int n;while (cin >> n && n) {int minn = 0x3f3f3f3f;int minn_id = 0;for (int i = 0; i < n; i++) {cin >> num[i];if (num[i] < minn) {minn = num[i];minn_id = i;}}swap(num[0],num[minn_id]);for (int i = 0; i < n; i++) {if (i == 0) cout << num[0];else cout << " " << num[i];}cout << endl;} return 0;
}

18. 字符串统计(HDU2017)

思路:判断数字

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {int cnt = 0;string s; cin >> s;for (int i = 0; i < s.size(); i++) {if (s[i] >= '0' && s[i] <= '9') cnt++;}cout << cnt << endl;}return 0;
}

19. 母牛的故事(HDU2018)

思路:动态规划,初始第一年的牛 1头(这头牛已经具有生育能力,可以理解为它岁数已经>=4),第二年的牛 2头,第三年的牛 3头。然后根据递推方程

a[i]=a[i-1]+a[i-3] 也就是今年的牛是去年的牛数量的基础上加上三年前之前的牛(也就是岁数>=4的牛)生出的新牛数量(这些新牛数量刚好就是这些大岁数的牛的数量,因为一头成熟的牛 每年必生且只生 一头小牛)

代码:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{int i,n;int a[60];a[1]=1;a[2]=2;a[3]=3;for(i=4;i<56;i++){a[i]=a[i-1]+a[i-3];}while(scanf("%d",&n)!=EOF && n){printf("%d\n",a[n]);}return 0;
}

20. 数列有序!(HDU2019)

思路:边输入边输出,如果m大于当前数,就输出当前数;如果m小于当前数,就将m和当前数一起输出。并将m设为无穷大,防止重复输出。

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int n, m; while (cin >> n >> m&&n&&m) {for (int i = 0; i < n; i++) {int num; cin >> num;if (m != 0x3f3f3f3f && m <= num) {cout << m << " " << num ;m = 0x3f3f3f3f;}else {cout << num ;}if(i!=n-1) cout<<" ";}cout << endl;}return 0;
}

21. 绝对值排序(HDU2020)

思路:使用STL sort自定义排序算法(超级方便,不会的可以自行搜索学习qwq)

代码:

#include<bits/stdc++.h>
using namespace std;
int num[105];
bool cmp(int a, int b) {return abs(a) > abs(b); //如果a的绝对值大于b的绝对值,返回true,让a排在b前面
}
int main() {int n; while (cin >> n && n) {for (int i = 0; i < n; i++) {cin >> num[i];}sort(num, num + n, cmp);for (int i = 0; i < n; i++) {if (i == 0) cout << num[i];else cout << " " << num[i];}cout << endl;}return 0;
}

22. 发工资咯:)(HDU2021)

思路:贪心,想要最少的钞票数,那钞票的面值肯定要越大越好。所以对于每个人的工资,先给他他能达到的最大面值的钱。可以通过int除法去除小数。对于工资45的老师,50面值太多了,所以先考虑10面值,给多少张10面值的钱呢。可以通过int除法:45/10=4 得知。

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int n;while (cin >> n && n) {int ans = 0;while (n--) {int salary; cin >> salary;while (salary > 0) {if (salary >= 100) {ans += (salary / 100);salary -= (salary / 100) * 100;}else if (salary >= 50) {ans += (salary / 50);salary -= (salary / 50) * 50;}else if (salary >= 10) {ans += (salary / 10);salary -= (salary / 10) * 10;}else if (salary >= 5) {ans += (salary / 5);salary -= (salary / 5) * 5;}else if (salary >= 2) {ans += (salary / 2);salary -= (salary / 2) * 2;}else {ans += salary;salary = 0;}}}cout << ans << endl;}return 0;
}

23. 海选女主角(HDU2022)

思路:用row,col,MAX实时记录更新的数据即可

代码:

#include<bits/stdc++.h>
using namespace std;
int MM[105][105];
int main() {int n, m;while (cin >> n >> m) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> MM[i][j];}}int row, col, MAX = -1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (abs(MM[i][j]) > MAX) {MAX = abs(MM[i][j]);row = i, col = j;}}}cout << row << " " << col << " " << MM[row][col] << endl;}return 0;
}

24. 求平均成绩(HDU2023)

思路:用二维数组,二维数组稍微开大点,这样就可以用后面的空间,存同一行或同一列的值。

因为scanf/printf较快,用较慢的cin/cout会WA!

代码:

#include<bits/stdc++.h>
using namespace std;
double score[55][10];
int main() {int n, m;while (cin >> n >> m) {memset(score, 0, sizeof(score));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%lf", &score[i][j]);score[i][m] += score[i][j];score[n][j] += score[i][j];}score[i][m] /= m;}for (int j = 0; j < m; j++) score[n][j] /= n;int exceed = 0;for (int i = 0; i < n; i++) {int flag = true;for (int j = 0; j < m; j++) {if (score[i][j] < score[n][j]) flag = false;}if (flag) exceed++;}for (int i = 0; i < n; i++) {if(i!=0) cout<<" ";printf("%.2lf", score[i][m]);}cout << '\n';for (int j = 0; j < m; j++) {if(j!=0) cout<<" ";printf("%.2lf", score[n][j]);}cout << '\n';printf("%d\n\n", exceed);}return 0;
}

25. C语言合法标识符(HDU2024)

思路:C语言标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线()组成的字符串,并且其第一个字符必须是字母或下划线。

代码:

#include<bits/stdc++.h>
using namespace std;
bool legal(string s) {if (isdigit(s[0])) return false;for (int i = 0; i < s.size(); i++) {if (!isalnum(s[i]) && s[i] != '_') return false;}return true;
}
int main() {int t; cin >> t;getchar();while (t--) {string s;getline(cin, s);if (legal(s)) cout << "yes" << endl;else cout << "no" << endl;}return 0;
}

26. 查找最大元素(HDU2025)

思路:MAX记录最大值

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {string s;while (getline(cin, s)) {int MAX = -1;for (int i = 0; i < s.size(); i++) {if (s[i] - 'a' > MAX) MAX = s[i] - 'a';}for (int i = 0; i < s.size(); i++) {if (s[i] - 'a' == MAX) cout << s[i] << "(max)";else cout << s[i];}cout << endl;}return 0;
}

27. 首字母变大写(HDU2026)

思路:toupper函数,printf("%c") 格式化输出

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {string s;while (getline(cin, s)) {for (int i = 0; i < s.size(); i++) {if (i == 0) printf("%c", toupper(s[i]));else if (i != 0 && s[i - 1] == ' ') printf("%c", toupper(s[i]));else cout << s[i];}cout << endl;}return 0;
}

28. 统计元音(HDU2027)

思路:五个计数器,注意输出格式控制

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;getchar();while (t--) {string s;getline(cin, s);int a = 0, b = 0, c = 0, d = 0, e = 0;for (int i = 0; i < s.size(); i++) {if (s[i] == 'a') a++;else if (s[i] == 'e') b++;else if (s[i] == 'i') c++;else if (s[i] == 'o') d++;else if (s[i] == 'u') e++;}cout << "a:" << a << endl;cout << "e:" << b << endl;cout << "i:" << c << endl;cout << "o:" << d << endl;cout << "u:" << e << endl;if (t != 0) cout << endl;}return 0;
}

29. Lowest Common Multiple Plus(HDU2028)

思路:gcd函数求两个数的最小公倍数,然后要求三个数的最小公倍数的话,可先求前两个的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,以此类推。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int gcd(int a, int b) {return b == 0 ? a : gcd(b,a%b);
}
signed main() {int n; while (cin>>n) {int a[105] = { 0 };for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n - 1; i++) {int g = gcd(a[i], a[i + 1]);a[i + 1] = (a[i] * a[i + 1]) / g;}cout << a[n - 1] << endl;}return 0;
}

30. Palindromes _easy version(HDU2029)

思路:左右对比回文串

代码:

#include<bits/stdc++.h>
using namespace std;
bool is(string s) {int l = 0, r = s.size() - 1;while (l < r) {if (s[l] != s[r]) return false;l++, r--;}return true;
}
int main() {int t; cin >> t;getchar();while (t--) {string s; getline(cin, s);if (is(s)) cout << "yes" << endl;else cout << "no" << endl;}return 0;
}

31. 汉字统计(HDU2030)

思路:汉字码是小于0。并且一个汉字占两个字节。

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;getchar();while (t--) {string s;getline(cin, s);int cnt = 0;for (int i = 0; i < s.size(); i++) {if (s[i] < 0) cnt++;}cout << cnt / 2 << endl;}return 0;
}

32. 进制转换(HDU2031)

思路:进制转换经典例题

资料:十进制转换成十六进制

代码:

#include<bits/stdc++.h>
using namespace std;
string turn(int num, int radix) {stack<char> st;while (num > 0) {int temp = num % radix;if (temp >= 10) st.push(temp - 10 + 'A');else st.push(temp + '0');num /= radix;}string ans = "";while (!st.empty()) {ans += st.top();st.pop();}return ans;
}
int main() {int num, radix;while (cin >> num >> radix) {if (num < 0) {cout << '-';num = -num;}cout << turn(num, radix) << endl;}return 0;
}

33. 杨辉三角(HDU2032)

思路:先预处理出30行的杨辉三角,再直接用就行。某行的杨辉三角规律,第一列与最后一列为1,其他的值为上一行的上一列的值加上一行的同一列的值。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[35][35];
void pre() {a[0][0] = 1;for (int i = 1; i <= 29; i++) {for (int j = 0; j <= i; j++) {if (j == 0 || j == i) a[i][j] = 1;else a[i][j] = a[i - 1][j - 1] + a[i - 1][j];}}
}
int main() {pre();int n;while (cin >> n) {for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) {if (j != 0) cout << " ";cout << a[i][j];}cout << endl;}cout << endl;}return 0;
}

34. 人见人爱A+B(HDU2033)

思路:取余与int除法的应用

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {int ah, am, as, bh, bm, bs;cin >> ah >> am >> as >> bh >> bm >> bs;int cs = (as + bs) % 60;int cm = (am + bm + (as + bs) / 60) % 60;int ch = ah + bh + (am + bm + (as + bs) / 60) / 60;cout << ch << " " << cm << ' ' << cs << endl;}return 0;
}

35. 人见人爱A-B(HDU2034)

思路:使用set可以自动排序,并且可以按值删除;

资料:set常见用法详解

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int n, m;set<int> se;while (cin >> n >> m && (n||m)) {se.clear();for (int i = 0; i < n; i++) {int num; cin >> num;se.insert(num);}for (int i = 0; i < m; i++) {int num; cin >> num;if (se.find(num) != se.end()) se.erase(num);}if (se.size() == 0) cout << "NULL" << endl;else {for (auto it = se.begin(); it != se.end(); it++) cout << *it << " ";cout << endl;}}return 0;
}

36. 人见人爱A^B(HDU2035)

思路:因为数可能会特别大,所以一步步次方的同时要一步步对1000取余,聚焦于后三位数字

代码:

#include<bits/stdc++.h>
using namespace std;
int f(int n, int m) {int ans = 1;while (m--) {ans *= n;ans %= 1000;}return ans;
}
int main() {int n, m;while (cin >> n >> m && (n || m)) {cout << f(n, m) << endl;}return 0;
}

37. 改革春风吹满地(HDU2036)

思路:叉乘,这题的多边形好像都是中点在原点,或则卡轴三角形,所以简化了向量的获得过程

参考:叉乘

代码:

#include<bits/stdc++.h>
using namespace std;
struct point {int x, y;
}p[105];
int main() {int n;while (cin >> n && n) {for (int i = 0; i < n; i++) {cin >> p[i].x >> p[i].y;}p[n].x = p[0].x, p[n].y = p[0].y;int area = 0;for (int i = 0; i < n; i++) {area += (p[i].x * p[i + 1].y - p[i].y * p[i + 1].x);}printf("%.1lf\n", area / (double)2);}return 0;
}

38. 今年暑假不AC(HDU2037)

思路:贪心,将所有的节目按结束时间从小到大排序;初始化当前进行到的时间点(prelast,上一个能看的节目的结束时间,初始化为0),只要被判断的这个节目开始的时间>=当前的时间,就把这个节目算进去,然后更新prelast。

代码:

#include<bits/stdc++.h>
using namespace std;
struct pro {int s, e;
}p[105];
bool cmp(pro a, pro b) {return a.e < b.e;
}
int main() {int n;while (cin >> n && n) {for (int i = 0; i < n; i++) {cin >> p[i].s >> p[i].e;}sort(p, p + n, cmp);int prelast = 0, ans = 0; //prelast表示上一个能看的节目的结束时间for (int i = 0; i < n; i++) {if (p[i].s >= prelast) {ans++;prelast = p[i].e;}}cout << ans << endl;}return 0;
}

39. 三角形(HDU2039)

思路:两边之和大于第三边,记得用double!!!(我前面define了)

代码:

#include<bits/stdc++.h>
#define int double
using namespace std;
bool is(int a, int b, int c) {if (a == 0 || b == 0 || c == 0) return false;if (a + b <= c || a + c <= b || b + c <= a) return false;return true;
}
signed main() {int t; cin >> t;while (t--) {int a, b, c; cin >> a >> b >> c;if (is(a, b, c)) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

40. 亲和数(HDU2040)

思路:求真约数咯!

代码:

#include<bits/stdc++.h>
using namespace std;
int yue(int num) {int ans = 1; //真约数一定有 1for (int i = 2; i <= sqrt(num); i++) {if (i != sqrt(num) && num % i == 0) ans += (i + (num / i));if (i == sqrt(num) && num % i == 0) ans += sqrt(num);}return ans;
}
int main() {int t; cin >> t;while (t--) {int num1, num2; cin >> num1 >> num2;if (yue(num1) == num2 && yue(num2) == num1) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

41. 超级楼梯(HDU2041)

思路:动态规划,当前的方法等于上一级的方法加上两级的方法

代码:

#include<bits/stdc++.h>
using namespace std;
int dp[55];
void pre() {dp[2] = 1;dp[3] = 2;for (int i = 4; i <= 40; i++) {dp[i] = dp[i - 1] + dp[i - 2];}
}
int main() {pre();int t; cin >> t;while (t--) {int M; cin >> M;cout << dp[M] << endl;}return 0;
}

42. 不容易系列之二(HDU2042)

思路:先预处理,然后动态规划,从后往前算

代码:

#include<bits/stdc++.h>
using namespace std;
int dp[35];
void pre() {dp[0] = 3;for (int i = 1; i <= 30; i++) {dp[i] = (dp[i - 1] - 1) * 2;}
}
int main() {pre();int t; cin >> t;while (t--) {int n; cin >> n;cout << dp[n] << endl;}return 0;
}

43. 密码(HDU2043)

思路:各种函数快捷判断

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {string s; cin >> s;int a = 0, b = 0, c = 0, d = 0;for (int i = 0; i < s.size(); i++) {if (isupper(s[i])) a = 1;else if (islower(s[i])) b = 1;else if (isdigit(s[i])) c = 1;else d = 1;}if ((a + b + c + d >= 3) && s.size() >= 8 && s.size() <= 16) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

44. 一只小蜜蜂...(HDU2044)

思路:根据b-a的差值为关键进行动态规划,就是将a变成1,b变成b-a+1,这样就将起点都变成1了,方便运算。从1到达5的路线数=从1到达3的路线数+从1到达4的路线数。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[55];
void pre() {dp[0] = 1;dp[1] = 1;for (int i = 2; i <= 50; i++) {dp[i] = dp[i - 1] + dp[i - 2];}
}
signed main() {pre();int t; cin >> t;while (t--) {int a, b; cin >> a >> b;cout << dp[b - a] << endl;}return 0;
}

45. 不容易系列之(3)―― LELE的RPG难题(HDU2045)

思路:

n个格子只需要先涂n-1个,再涂一个就好。

1.第一个和第n-1个不同色的情况,,那么第n个只有一种涂法,所以第一种情况有1*a[n-1]种

2.第1个和第n-1个同色,那么第n个有两种涂法,而第1个和第n-1个同色的种数就是a[n-2]*1种,所以第二种情况有a[n-2]*1*2种

所以a[n]=a[n-1]+2*a[n-2]

n=3是特例,因为当n=3时是没有第二种情况的

代码:

#include<bits/stdc++.h>
using namespace std;
long long a[60];
void pre() {a[1] = 3, a[2] = 6, a[3] = 6;for (int i = 4; i <= 50; i++) {a[i] = a[i - 1] + 2 * a[i - 2];}
}
int main() {pre();int n;while (cin >> n) {cout << a[n] << endl;}return 0;
}

46. 骨牌铺方格(HDU2046)

思路:动态规划

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[55];
void pre() {dp[1] = 1, dp[2] = 2;for (int i = 3; i <= 50; i++) {dp[i] = dp[i - 1] + dp[i - 2];}
}
signed main() {pre();int n;while (cin >> n) {cout << dp[n] << endl;}return 0;
}

47. 阿牛的EOF牛肉串(HDU2047)

思路:杭电ACM 2047 - 阿牛的EOF牛肉串(解题思路与详细分析)

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[50];
void pre() {dp[1] = 3, dp[2] = 8;for (int i = 3; i <= 40; i++) {dp[i] = 2 * dp[i - 1] + 2 * dp[i - 2];}
}
signed main() {pre();int n; while (cin >> n) {cout << dp[n] << endl;}return 0;
}

48. 神、上帝以及老天爷(HDU2048)

思路:神,上帝以及老天爷_昔我往矣wood的博客-CSDN博客_神、上帝以及老天爷

代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{int i,j,n,a;double g,f[100];scanf("%d",&n);for(j=0;j<n;j++){g=1;scanf("%d",&a);for(i=1;i<=a;i++){g*=i;}f[1]=0;f[2]=1;f[3]=2;for(i=3;i<=20;i++){f[i]=(i-1)*(f[i-1]+f[i-2]);}printf("%.2lf%%\n",f[a]/g*100);}return 0;
}

49. 不容易系列之(4)――考新郎(HDU2049)

思路:[ 不容易系列之(4)——考新郎]+(错排的简单理解+改进计算组合数)_丿繁年的博客-CSDN博客

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int f[105];
int C(int n, int m) {int ans = 1;if (m < n - m) m = n - m;for (int i = m + 1; i <= n; i++) {ans *= i;}for (int i = 1; i <= n - m; i++) {ans /= i;}return ans;
}
void pre() {f[1] = 0, f[2] = 1;for (int i = 3; i <= 20; i++) {f[i] = (i - 1) * (f[i - 1] + f[i - 2]);}
}
signed main() {pre();int t; cin >> t;while (t--) {int n, m; cin >> n >> m;cout << f[m] * C(n, m) << endl;}return 0;
}

50. 折线分割平面(HDU2050)

思路:折线分割平面(图文解析)_扣子不会飞的博客-CSDN博客_折线分割平面

代码:

#include<bits/stdc++.h>
using namespace std;
int f(int m) {int sum = 0;for (int i = 1; i <= m - 2; i++) sum += i;sum += 2 * m;return sum;
}
int main() {int t; cin >> t;while (t--) {int n; cin >> n;cout << f(2 * n) - 2 * n << endl;}return 0;
}

51. Bitset(HDU2051)

思路:十进制转二进制

代码:

#include<bits/stdc++.h>
using namespace std;
void f(int n) {stack<int> st;while (n > 0) {st.push(n % 2);n /= 2;}while (!st.empty()) {printf("%d",st.top());st.pop();}
}
int main() {int n;while (~scanf("%d",&n)) {f(n);puts("");}return 0;
}

52. Picture(HDU2052)

思路:模拟

代码:

#include<stdio.h>
#include<string.h>int main(void) {int i, j, w, h;char ch[100][100];while (scanf("%d %d", &w, &h) != EOF) {memset(ch, ' ', 100 * 100*sizeof(char));ch[0][0] = '+';ch[0][w+1] = '+';ch[h+1][0] = '+';ch[h+1][w+1] = '+';for (i = 1; i <= w; i++) {ch[0][i] = '-';ch[h+1][i] = '-';}for (j = 1; j <= h; j++) {ch[j][0] = '|';ch[j][w+1] = '|';}for (i = 0; i < h+2; i++) {for (j = 0; j < w+2; j++)printf("%c", ch[i][j]);putchar('\n');}putchar('\n');}return 0;
}

53. Switch Game(HDU2053)

思路:看某个数的因子有几个,就知道操作了几次

代码:

#include<bits/stdc++.h>
using namespace std;
bool f(int n) {int sum = 0;for (int i = 1; i <= n; i++) {if (n % i == 0) sum++;}return !(sum % 2 == 0);
}
int main() {int n;while (cin >> n) {cout << f(n) << endl;}return 0;
}

54. A == B ?(HDU2054)

思路:用字符串,消除前导零和小数后缀零

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {string a, b; while (cin >> a >> b) {if (a.find('.')!=-1 && a[a.size() - 1] == '0') {int id = a.size() - 1;while (id >= 0 && a[id] != '.' && a[id] == '0') {a.pop_back();id--;}}if (a[a.size() - 1] == '.') a.pop_back();while (a.size() && a[0] == '0') a.erase(a.begin());if (b.find('.')!=-1 && b[b.size() - 1] == '0') {int id = b.size() - 1;while (id >= 0 && b[id] != '.' && b[id] == '0') {b.pop_back();id--;}}if (b[b.size() - 1] == '.') b.pop_back();while (b.size() && b[0] == '0') b.erase(b.begin());if (a == b) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

55. An easy problem(HDU2055)

思路:字符差变数字

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {char a; int b; cin >> a >> b;int sum = 0;if (islower(a)) sum -= (a - 'a' + 1);else sum += (a - 'A' + 1);cout << sum + b << endl;}return 0;
}

56. Rectangles(HDU2056)

思路:检测重叠部分

代码:

#include <stdio.h>double min(double x1,double x2)
{if(x1<x2)return x1;elsereturn x2;
}
double max(float x1,double x2)
{if(x1>x2)return x1;elsereturn x2;
}
void change(double *a ,double *b)
{double temp;temp = *a;*a = *b;*b = temp;
}
int main()
{double x1,x2,x3,x4,y1,y2,y3,y4,s;while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4)){if(x1>x2) change(&x1,&x2);if(x3>x4) change(&x3,&x4);if(y1>y2) change(&y1,&y2);if(y3>y4) change(&y3,&y4);if((x4>x1)&&(y4>y1)&&(x3<x2)&&(y3<y2)){s=(min(x2,x4)-max(x1,x3))*(min(y2,y4)-max(y1,y3));printf("%.2lf\n",s);}elseprintf("0.00\n");}return 0;
}

57. A + B Again(HDU2057)

思路:使用格式化输入输出,64位整数

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{__int64 a,b,sum;
while(scanf("%I64X %I64X",&a,&b) != EOF)
{sum = a + b;if(sum < 0){sum = fabs(sum);printf("-%I64X\n",sum);}elseprintf("%I64X\n",sum);
}
return 0;
}

58. The sum problem(HDU2058)

思路:【杭电oj】2058 - The sum problem(高斯公式)_wyg1997的博客-CSDN博客

代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{long long n,m;long long a,b;while (~scanf("%lld %lld",&n,&m) && (n || m)){for (int i = sqrt((double)(2*n)) ; i > 0 ; i--){if ((2 * m) % i == 0 && ((2 * m / i) + i - 1) % 2 == 0){a = ((2 * m / i) + i - 1) / 2;b = 2 * m / i - a;if (a > b)swap(a,b);if (a > 0)printf ("[%d,%d]\n",a,b);}}printf ("\n");}return 0;
}

59. 龟兔赛跑(HDU2059)

思路:HDU 2059-龟兔赛跑_凉哈哈的博客-CSDN博客

代码:

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 105;
int h[N];
double dp[N];
int main() {int l;while (cin >> l) {int n, c, t; cin >> n >> c >> t;int vr, vt1, vt2; cin >> vr >> vt1 >> vt2;for (int i = 1; i <= n; i++) cin >> h[i];h[0] = 0, h[n + 1] = l;dp[0] = 0;double tu = l * 1.0 / vr;for (int i = 1; i <= n + 1; i++) {double minx = INF;for (int j = 0; j < i; j++) {int dis = h[i] - h[j];double time;if (c >= dis) time = dis * 1.0 / vt1;else time = (c * 1.0 / vt1) + (dis - c) * 1.0 / vt2;if (j != 0) time += t;if (dp[j] + time < minx) minx = dp[j] + time;}dp[i] = minx;}if (dp[n + 1] > tu) cout << "Good job,rabbit!" << endl;else cout << "What a pity rabbit!" << endl;}return 0;
}

60. Snooker(HDU2060)

参考:HDU2060 Snooker【水题】_ITCharge的博客-CSDN博客

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;int main()
{int N;cin >> N;while(N--){int ball,score1,score2;cin >> ball >> score1 >> score2;if(ball > 6){score1 += (ball-6)*8+27;}else{int i = 7;while(ball--){score1 += i;i--;}}if(score1 >= score2)cout << "Yes" << endl;elsecout << "No" << endl;}return 0;
}

61. Treasure the new start, freshmen!(HDU2061)

思路:算GPA

代码:

#include <cstdio>
#include <iostream>
#include <string> using namespace std;int main()
{int N;int j = 0;  cin >> N;while(N--){string name;double credits,score;double mem = 0, sum = 0;int flag = 1, K;cin >> K;while( K-- ){cin >> name >> credits >> score;if(score < 60)flag = 0;mem+=credits*score;sum+=credits; }if(flag)printf("%.2lf\n",mem/sum);elseprintf("Sorry!\n");if( N )printf("\n");}return 0;
}

62. Subset sequence(HDU2062)

参考:HDU 2062——Subset sequence(最详细的解释,看不懂你找我)_unique_pursuit的博客-CSDN博客

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
#include<cmath>
#include<string>using namespace std;const int maxn=25;
int n;//n:An
long long m;//   m:第m个子集序列。
long long g[maxn]={0}; //代表的就是g(n),即第n个分组中每组的子集数。
int num[maxn];   //存放分组后的首元素。
long long  i;//循环控制变量
long long  temp;//临时变量,代表所求m位于的分组int main()
{for(i=1;i<=maxn;i++)g[i]=(i-1)*g[i-1]+1; //打g(n)表,供下面使用while(cin>>n>>m){for(i=0;i<=maxn;i++)num[i]=i;while(n>0&&m>0){temp=(m-1)/g[n]+1; //确定在第几个分组if(temp>0)//说明所求第m个子集位于第temp个分组。{cout<<num[temp];for(i=temp;i<=n;i++){num[i]=num[i+1];//我们将其首元素从中剔除,继续分组寻找下一个。}m=m-((temp-1)*g[n]+1);//要更新m的值,因为我们已经剔除了前面(temp-1)个分组,加1是因为序号是从1开始。if(m!=0)cout<<" ";else cout<<endl;}n--;    //剔除元素,接下来就是在An-1中寻找第m个子集序列。}}system("pause");return 0;
}

63. 过山车(HDU2063)

参考:【例题记录】匈牙利算法求二分图的最大匹配_Ctrl AC的博客-CSDN博客

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int f[N][N], used[N], match[N];
int e, n, m;
bool DFS(int left) {for (int i = 1; i <= m; i++) {if (f[left][i] && !used[i]) {used[i] = true;if (!match[i] || DFS(match[i])) {match[i]=left;return true;}}}return false;
}
int main() {while (cin >> e , e) {cin >> n >> m;memset(match, 0, sizeof match);memset(f, 0, sizeof f);for (int i = 1; i <= e; i++) {int x, y; cin >> x >> y;f[x][y] = true;}int cnt = 0;for (int i = 1; i <= n; i++) {memset(used, 0, sizeof used);if (DFS(i)) cnt++;}cout << cnt << endl;}return 0;
}

64. 汉诺塔III(HDU2064)

思路:hdu 2064:汉诺塔III_serendipityLB的博客-CSDN博客

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 36;
int f[N];
signed main() {f[1] = 2;for (int i = 2; i <= 35; i++) {f[i] = 3 * f[i - 1] + 2;}int n;while (cin >> n) {cout << f[n] << endl;}return 0;
}

65. "红色病毒"问题(HDU2065)

思路:【组合数学】 红色病毒问题 详解(指数型生成函数+泰勒展开)_Nefu_qky的博客-CSDN博客

代码:

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;long long quickpower(long long base,long long power){long long ret=1;while(power){if(power%2)ret=ret*base%100;base=base*base%100;power/=2;}return ret;
}int main()
{int T;while(~scanf("%d",&T)&&T){for(int i=1;i<=T;i++){long long N;scanf("%lld",&N);printf("Case %d: %lld\n",i,(quickpower(4,N-1)+quickpower(2,N-1))%100);}printf("\n");}return 0;
}

66. 一个人的旅行(HDU2066)

思路:HDU2066:一个人的旅行(Dijkstra)_键盘上的舞者的博客-CSDN博客

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int inf = 1<<30;int T,S,D,n;
int map[1111][1111];
int vis[1111],cast[1111];
int s[1111],e[1111];void Dijkstra()
{int i,j,minn,pos;memset(vis,0,sizeof(vis));vis[0] = 1;for(i = 0; i<=n; i++)cast[i] = map[0][i];for(i = 1; i<=n; i++){minn = inf;for(j = 1; j<=n; j++){if(cast[j]<minn && !vis[j]){pos = j;minn = cast[j];}}vis[pos] = 1;for(j = 1; j<=n; j++){if(cast[pos]+map[pos][j]<cast[j] && !vis[j])cast[j] = cast[pos]+map[pos][j];}}
}int main()
{int i,j,x,y,z,start,end;while(~scanf("%d%d%d",&T,&S,&D)){n = 0;for(i = 0; i<1111; i++){for(j = 0; j<1111; j++)map[i][j] = inf;map[i][i] = 0;}while(T--){scanf("%d%d%d",&x,&y,&z);n = max(max(n,x),y);if(z<map[x][y])map[x][y] = map[y][x] = z;}int minn = inf;for(i = 0; i<S; i++){scanf("%d",&s[i]);map[0][s[i]] = map[s[i]][0] = 0;}for(i = 0; i<D; i++)scanf("%d",&e[i]);Dijkstra();for(i = 0; i<D; i++)minn = min(minn,cast[e[i]]);printf("%d\n",minn);}return 0;
}

67. 小兔的棋盘(HDU2067)

思路:HDU2067——小兔的棋盘(迷宫,动态规划,卡特兰数)_一百个Chocolate的博客-CSDN博客

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=40;
long long dp[maxn][maxn];
int main()
{memset(dp,0,sizeof(dp));for(int i=1;i<maxn;i++){dp[i][0]=1;for(int j=1;j<i;j++){dp[i][j]=dp[i-1][j]+dp[i][j-1];}dp[i][i]=dp[i][i-1];}int k=0;int n;while(cin>>n&&n!=-1){cout<<++k<<" "<<n<<" "<<2*dp[n][n]<<endl;}return 0;
}

68. RPG的错排(HDU2068)

思路:RPG的错排【错排公式+组合数学】_Wuliwuliii的博客-CSDN博客

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 28;
int N, mid;
ll f[maxN], ans, jiecheng[maxN];
void pre_did()
{f[0] = f[1] = 0;    //当只有0、1的情况的时候不存在错误的排序的可能,所以就是0f[2] = 1;   //错误的排序的存在可能jiecheng[0] = jiecheng[1] = 1;jiecheng[2] = 2;for(int i=3; i<maxN; i++){f[i] = (i - 1) * (f[i-1] + f[i-2]);jiecheng[i] = jiecheng[i-1] * i;}
}
ll Cal(int down, int up)
{ll ans = 1;for(int i=down; i>=down - up + 1; i--) ans *= i;for(int i=up; i>1; i--) ans /= i;return ans;
}
int main()
{pre_did();while(scanf("%d", &N) && N){mid = N/2;  ans = 0;for(int i=0; i<=mid; i++){ans += Cal(N, i) * f[i];    //全都答对时的f[0]==0,会丢失一个答案}printf("%lld\n", ans + 1);}return 0;
}

69. Coin Change(HDU2069)

思路:Coin Change HDU - 2069 (超详细题解)_林小鹿@的博客-CSDN博客

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[5] = { 1,5,10,25,50 }; ///表示5种硬币各自的价值
int dp[110][260];///表示dp[i][v] 用i个硬币凑成价值为v的方法数
int main()
{int n;while (cin >> n){memset(dp, 0, sizeof(dp)); //初始化dp数组dp[0][0] = 1;///边界for (int i = 0; i < 5; i++){for (int k = 1; k <= 100; k++) //k个硬币{for (int v = a[i]; v <= n; v++){dp[k][v] += dp[k - 1][v - a[i]];//状态转移方程}                        }}int ans = 0;for (int i = 0; i <= 100; i++){ans += dp[i][n];}cout << ans << endl;}return 0;
}

70. Fibbonacci Number(HDU70)

思路:斐波那契数

代码:

#include<bits/stdc++.h>
using namespace std;
__int64 fibo[55];
void pre() {fibo[0] = 0, fibo[1] = 1;for (int i = 2; i <= 50; i++) {fibo[i] = fibo[i - 1] + fibo[i - 2];}
}
int main() {pre();int n;while (cin >> n && n != -1) cout << fibo[n] << endl;return 0;
}

71. Max Num(HDU2071)

思路:HDU-2071 Max Num_springflower02的博客-CSDN博客

代码:

#include <iostream>using namespace std;int main() {int n;cin>>n;for(int i=0; i<n; i++){int m;cin>>m;double max;cin>>max;for(int j=1; j<m; j++){double tmp;cin>>tmp;if(tmp>max){max = tmp;}}printf("%.2lf\n", max);} return 0;
}

72. 单词数(HDU2072)

思路:HDU 2072 单词数_ultimater的博客-CSDN博客

代码:

#include<iostream>
#include<string>
#include<sstream>
#include<set>using namespace std;int main()
{string s,w;while(getline(cin,s),s!="#"){istringstream src(s);set<string>st;while(src>>w)st.insert(w);cout<<st.size()<<endl;}return 0;
}

73. 无限的路(HDU2073)

思路:杭电OJ2073 无限的路(已AC,超详细解释,适合初学者)_HDU-五七小卡的博客-CSDN博客

代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
double f[210];
double dabiao()//有公式了就先打表一下,就是提前计算好,下面代入点(x,y)的时候可以直接调用
{f[1]=1;for(int i=2;i<=200;i++){double m,n;m=sqrt((i-1)*(i-1)+(i-1)*(i-1));n=sqrt(i*i+(i-1)*(i-1));f[i]=f[i-1]+m+n;}//有不明白的见上面解析return 0;
}double distance(int x,int y)
{double d=0;d=f[x+y]+x*sqrt(2.0);return d;
}//点(x,y)到原点的距离公式int main()
{int x1,y1,x2,y2,n;double d1,d2,d;dabiao();while(scanf("%d",&n)!=EOF){while(n--){scanf("%d%d%d%d",&x1,&y1,&x2,&y2);d1=distance(x1,y1);d2=distance(x2,y2);d=d1-d2;if(d<0) d=-d;printf("%.3lf\n",d);}}return 0;
}

74. 叠筐(HDU2074)

思路:一层层分析,注意格式

代码:

#include<bits/stdc++.h>
using namespace std;
void modify(char mp[][85], int level, int n, char now) {for (int j = level; j <= n - level + 1; j++) mp[level][j] = now, mp[n - level + 1][j] = now;for (int i = level; i <= n - level + 1; i++) mp[i][level] = now, mp[i][n - level + 1] = now;
}
int main() {int n; char cen, out;bool flag = false;while (cin >> n >> cen >> out) {if (flag) {puts("");}else flag = true;char mp[85][85];int level = (n + 1) / 2;int now = level & 1 ? out : cen;for (int i = 1; i <= level; i++) {now = now == cen ? out : cen;modify(mp, i, n, now);}if (n == 1) {cout << cen << endl ;}else {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if ((i == 1 && j == 1) || (i == 1 && j == n) || (i == n && j == 1) || (i == n && j == n)) cout << ' ';else cout << mp[i][j];}cout << endl;}}}return 0;
}

75. A|B?(HDU2075)

思路:大水题

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main() {int t; cin >> t;while (t--) {int a, b; cin >> a >> b;if (a % b == 0) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

76. 夹角有多大(题目已修改,注意读题)(HDU2076)

思路:按比例算

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {double h, m, s; cin >> h >> m >> s;if (h > 12) h -= 12;double shi = (h / 12) * 360 + ((m * 60 + s) / 3600) * 30;double fen = (m / 60) * 360 + (s / 60) * 6;double d = max(fen, shi) - min(fen, shi);if (d > 180) d = 360 - d;cout << (int)d << endl;}return 0;
}

77. 汉诺塔IV(HDU2077)

思路:【杭电oj】2077 - 汉诺塔IV(递推)_wyg1997的博客-CSDN博客

代码:

#include <cstdio>
int main()
{__int64 hanoi[22];        //把n个移到相邻杆子所需次数 hanoi[0] = 0;hanoi[1] = 1;for (int i = 2 ; i <= 19 ; i++)hanoi[i] = hanoi[i-1] * 3 + 1;int u;scanf ("%d",&u);int n;while (u--){scanf ("%d",&n);printf ("%d\n",2*hanoi[n-1]+2);}return 0;
}

78. 复习时间(HDU2078)

思路:HDU2078 复习时间【水题】_海岛Blog的博客-CSDN博客

代码:

/* HDU2078 复习时间 */#include <stdio.h>
#include <limits.h>int main(void)
{int t, n, m, a, i;scanf("%d", &t);while(t--) {scanf("%d%d", &n, &m);int min = INT_MAX;for(i=1; i<=n; i++) {scanf("%d", &a);if(a < min)min = a;}printf("%d\n", (100 - min) * (100 - min));}return 0;
}

79. 选课时间(HDU2079)

思路:选课时间 (HDU-2079)(母函数)_Stephencurry‘s csdn的博客-CSDN博客

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {int N, K; cin >> N >> K;int v[10], n[10], a[45], b[45];for (int i = 0; i < K; i++) {cin >> v[i] >> n[i];}memset(a, 0, sizeof a);a[0] = 1;for (int i = 0; i < K; i++) {memset(b, 0, sizeof b);for (int j = 0; j <= n[i] && j * v[i] <= N; j++) {for (int k = 0; k + j * v[i] <= N && k <= N; k++) {b[k + j * v[i]] += a[k];}}memcpy(a, b, sizeof b);}cout << a[N] << endl;}return 0;
}

80. 夹角有多大II(HDU2080)

思路:https://blog.csdn.net/weixin_44313771/article/details/104590798?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166281639716800192276318%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166281639716800192276318&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-104590798-null-null.142^v47^pc_rank_34_default_2,201^v3^control_1&utm_term=%E5%A4%B9%E8%A7%92%E6%9C%89%E5%A4%9A%E5%A4%A7II

代码:

#include<stdio.h>
#include<math.h>
int main()
{int T;double a, b, c, t, x1, y1, x2, y2;scanf("%d", &T);while (T--){scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);a = sqrt(x1 * x1 + y1 * y1);//第一个点到原点的距离b = sqrt(x2 * x2 + y2 * y2);//第二个点到原点的距离c = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));//两点之间的距离t = acos((a * a + b * b - c * c) / (2 * a * b)) * (180 / acos(-1.0));//因为cosπ=-1,所以arccos-1=πprintf("%.2f\n", t);}return 0;
}

81. 手机短号(HDU2081)

思路:字符串处理

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {string s; cin >> s;cout << 6;for (int i = 6; i <= 10; i++) {cout << s[i];}cout << endl;}return 0;
}

82. 找单词(HDU2082)

思路:母函数模板

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 10010;
const int INF = 0x3f3f3f3f;
int n[maxn], v[maxn];
int sup[maxn], temp[maxn];
int main() {int t; cin >> t;while (t--) {for (int i = 1; i <= 26; i++) {cin >> n[i]; v[i] = i;}memset(sup, 0, sizeof sup);sup[0] = 1;for (int i = 1; i <= 26; i++) {memset(temp, 0, sizeof temp);for (int j = 0; j <= n[i] && j * v[i] <= 50; j++) {for (int k = 0; k <= 50 && k + j * v[i] <= 50; k++) {temp[k + j * v[i]] += sup[k];}}memcpy(sup, temp, sizeof temp);}int sum = 0;for (int i = 1; i <= 50; i++) {if (sup[i]) sum += sup[i];}cout << sum << endl;}return 0;
}

83. 简易版之最短距离(HDU2083)

思路:选中间的点

代码:

#include<stdio.h>
#include<math.h>
int main()
{int m,t,n,i,j,s,a[501],c;scanf("%d",&m);for (t=0;t<m;t++){s=0;scanf("%d",&n);for (i=0;i<n;i++)scanf("%d",&a[i]);for (i=0;i<n-1;i++)for (j=i+1;j<n;j++)if (a[i]>a[j]){c=a[i];a[i]=a[j];a[j]=c;}for (i=0;i<n;i++)s+=fabs(a[n/2]-a[i]);printf("%d\n",s);}
}

84. 数塔(HDU2084)

思路:动态规划,从底层开始往上推

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {int n; cin >> n;int mp[105][105] = { 0 };for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {cin >> mp[i][j];}}for (int i = n - 1; i >= 1; i--) {for (int j = 1; j <= i; j++) {mp[i][j] = max(mp[i + 1][j], mp[i + 1][j + 1]) + mp[i][j];}}cout << mp[1][1] << endl;}return 0;
}

85. 核反应堆(HDU2085)

思路:递推

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int gao[35], di[35];
void pre() {gao[0] = 1, di[0] = 0;for (int i = 1; i <= 33; i++) {gao[i] = 3 * gao[i - 1] + 2 * di[i - 1];di[i] = gao[i - 1] + di[i - 1];}
}
signed main() {pre();int n;while (cin >> n && n != -1) {cout << gao[n] << ", " << di[n] << endl;}return 0;
}

86. A1 = ?(HDU2086)

思路:HDU2086 A1 = ?(组合数学 + 思维)_江心之人的博客-CSDN博客

代码:

#include <bits/stdc++.h>
using namespace std;int main() {int n;while (~scanf("%d",&n)) {double a0, an1;scanf("%lf%lf", &a0, &an1);double sum = 0;for (int i = 0; i < n; ++i) {double t;scanf("%lf", &t);sum += (n - i) * t;}double a1 = (n * a0 + an1 - 2 * sum) / (n + 1);printf("%.2lf\n", a1);}return 0;
}

87. 剪花布条(HDU2087)

思路:KMP算法【算法小结】KMP及扩展KMP_Ctrl AC的博客-CSDN博客

代码:

#include<bits/stdc++.h>
using namespace std;
int nxt[105];
void getNext(string s, int len) {int j = -1; nxt[0] = -1;for (int i = 1; i < len; i++) {while (j != -1 && s[i] != s[j + 1]) j = nxt[j];if (s[i] == s[j + 1]) j++;nxt[i] = j;}
}
int KMP(string text, string pattern) {int n = text.size(), m = pattern.size();getNext(pattern, m);int ans = 0, j = -1;for (int i = 0; i < n; i++) {while (j != -1 && text[i] != pattern[j + 1]) {j = nxt[j];}if (text[i] == pattern[j + 1]) j++;if (j == m - 1) ans++, j = -1;}return ans;
}
int main() {string a, b; while (cin >> a && a != "#") {cin >> b;cout << KMP(a, b) << endl;}return 0;
}

88. Box of Bricks(HDU2088)

思路:先算平均值,再算每个abs,加起来除2,注意输出格式

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int n; bool flag = false;while (cin >> n, n) {vector<int> vec;int all = 0;for (int i = 0; i < n; i++) {int num; cin >> num;all += num;vec.push_back(num);}int ave = all / n; int sum2 = 0;for (int i = 0; i < n; i++) {sum2 += abs(vec[i] - ave);}if (flag) cout << endl;else flag = true;cout << sum2 / 2 << endl;}return 0;
}

89. 不要62(HDU2089)

思路:数位dp总结 之 从入门到模板_wust_wenhao的博客-CSDN博客_数位dp

代码:

#include<bits/stdc++.h>
using namespace std;
int a[20];
int dp[20][2];
int dfs(int pos, int pre, int sta, bool limit) {//cout << "???" << endl;if (pos == -1) return 1;if (!limit && dp[pos][sta] != -1) return dp[pos][sta];int up = limit ? a[pos] : 9;int tmp = 0;for (int i = 0; i <= up; i++) {if (pre == 6 && i == 2) continue;if (i == 4) continue;tmp += dfs(pos - 1, i, i == 6, limit && i == a[pos]);}if (!limit) dp[pos][sta] = tmp;return tmp;
}
int solve(int num) {int pos = 0;while (num) {a[pos++] = num % 10;num /= 10;}return dfs(pos - 1, -1, 0, true);
}
int main() {int n, m;while (cin >> n >> m, n && m) {memset(dp, -1, sizeof dp);cout << solve(m) - solve(n - 1) << endl;}return 0;
}

90. 算菜价(HDU2090)

思路:水题

代码:

/* HDU2090 算菜价 */#include <stdio.h>#define N 32
char s[N];int main(void)
{double x, y, sum = 0;while(~scanf("%s%lf%lf", s, &x, &y))sum += x * y;printf("%.1f\n", sum);return 0;
}

91. 空心三角形(HDU2091)

思路:注意行末没有空格,观察每行的格式

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {char c; int height; bool flag = false;while (cin >> c && c != '@') {if (flag) { cout << endl; }else { flag = true; }cin >> height;int width = 2 * height - 1;for (int i = 1; i <= height-1; i++) {int space1 = height - i;int space2 = (i - 1) * 2 - 1;while (space1--) cout << " ";cout << c;if (space2 > 0) {while (space2--) cout << " ";cout << c;}cout << endl;}for (int i = 1; i <= width; i++) cout << c;cout << endl;}return 0;
}

92. 整数解(HDU2092)

思路:整数解(韦达定理解法)_轩辕小猪的博客-CSDN博客

代码:

#include<iostream>
using namespace std;
#include <cmath>
int main()
{ios::sync_with_stdio(false);int m, n;while (cin >> m >> n){if (m == 0 && n == 0)break;else{if ((m * m - 4 * n) < 0)cout << "No" << endl;else{if (sqrt(m * m - 4 * n) == (int)sqrt(m * m - 4 * n))cout << "Yes" << endl;elsecout << "No" << endl;}}}return 0;
}

93. 考试排名(HDU2093)

思路:2093 考试排名_焚冉的博客-CSDN博客

代码:

#include<iomanip>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct acm    //定义结构体
{char name[100];int ac;int sj;
}ss[10000];
bool cmp(acm a,acm b)  //排序函数
{if(a.ac==b.ac){return a.sj<b.sj;  //成绩为时间,越小越大}else{return a.ac>b.ac;  //ac数,大则大。}
}
int main()
{int z=0;int n,m;cin>>n>>m;    //输入考试题数n,单位罚分数m。while(cin>>ss[z].name)  //没有规定人数,直接用while循环{for(int a=0;a<n;a++){char ch;  //定义一个字符,在下面用于接收“)”int k,l;cin>>k;  //接收成绩if(k<=0){continue;  //如果输入的成绩小于0则跳出当前循环,进行下一次循环。}ss[z].ac++; //没有跳出循环的话,程序从上而下,执行这条语句,ac数+1ss[z].sj+=k;//当前人的总成绩if(getchar()=='(')//如果有字符“(”,接收且判断。Getchar()用于只接收一个字符。{cin>>l;   //接收罚题次数cin>>ch;  //接收字符“)”ss[z].sj+=l*m; //总成绩加上罚时}}z++;  //次数+1,此用于判断总统计人数。不然没有办法输出。}sort(ss,ss+n,cmp); //结构体排序for(int i=0;i<z;i++){cout<<left<<setw(10)<<ss[i].name<<" "<<right<<setw(2)<<ss[i].ac<<right<<" "<<setw(4)<<ss[i].sj<<endl;  //setw前带left,或者right表示数据左对齐还是有对齐,setw(n)表示n个长度。}return 0;}

94. 产生冠军(HDU2094)

思路:出度为零的点有且只有一个

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; while (cin >> t , t ) {map<string, int> chu;map<string, int> exist;while (t--) {string a, b; cin >> a >> b;exist[a]++; exist[b]++;chu[b]++;}int cnt = 0;for (auto it = exist.begin(); it != exist.end(); it++) {string now = it->first;if (chu[now] == 0) cnt++;}cout << (cnt == 1 ? "Yes" : "No") << endl;}return 0;
}

95. find your present (2)(HDU2095)

思路:同一个数异或同一个数等于零

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; while (scanf("%d",&t) != EOF && t ) {int sum = 0;for (int i = 0; i < t; i++) {int num; scanf("%d", &num);sum ^= num;}cout << sum << endl;}return 0;
}

96. 小明A+B(HDU2096)

思路:%100

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int t; cin >> t;while (t--) {int a, b; cin >> a >> b;a = a % 100, b = b % 100;int c = (a + b) % 100;cout << c << endl;}return 0;
}

97. Sky数(HDU2097)

思路:进制转换

代码:

#include<stdio.h>
int main()
{int n, s1, s2, sum;int fun(int n, int p);while (scanf("%d", &n) != EOF){if (n == 0)break;sum = (n / 1000) + (n % 1000) / 100 + (n % 100) / 10 + n % 10;s1 = fun(n, 12);s2 = fun(n, 16);if (sum == s1 && sum == s2)//判断printf("%d is a Sky Number.\n", n);elseprintf("%d is not a Sky Number.\n", n);}return 0;
}
int fun(int n, int p)
{int temp, s;s = 0;while (n != 0){temp = n % p;//求余数n = n / p;//求商s = s + temp;//求各位数的和}return s;
}

98. 分拆素数和(HDU2098)

思路:分拆素数和 (hdu 2098)_阿里斯顿k的博客-CSDN博客_分拆素数和

代码:

#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int k=0;        //1是素数 0不是素数
int sushu (int a){ for(int i=2;i*i<=a;i++){if(a%i==0)return 0;}return 1;
}
int main()
{int n,sum;while(~scanf("%d",&n),n){   sum=0;for(int i=2;i<n/2;i++){if(sushu(i)&&sushu(n-i))sum++;}printf("%d\n",sum); }return 0;
}

99. 整除的尾数(HDU2099)

思路:先乘上100,再看余数。注意格式

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {int a, b;while (cin >> a >> b, a && b) {a *= 100;int left = a % b;int add = b - left;bool first = true;if (add == b) {first = false;cout << "00";}for (int i = add; i <= 99; i += b) {if (!first) cout << " ";else first = false;if (i / 10 == 0) cout << 0 << i;else cout << i ;}cout << endl;}return 0;
}

“ Ctrl AC!一起 AC!”

【HDU100】杭电入门一百道 C++ 全 题 解相关推荐

  1. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

  2. 杭电 2544 最短路(bellman详解)

    首先介绍一下bellman算法: Bellman-ford算法是求含负权图的单源最短路径算法,效率很低,但代码很容易写.即进行持续地松弛(原文是这么写的,为什么要叫松弛,争议很大),每次松弛把每条边都 ...

  3. 杭电OJ——第1000,1001题

    今天第一次接触杭电OJ,感觉很新奇有趣.希望从今天开始其乐无穷的刷题之路吧 1000题: Problem Description Calculate A + B. Input Each line wi ...

  4. 杭电2073无限的路.水题

    无限的路 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. 回文素数(杭电OJ,不喜欢这个题)

    Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151既是素数又是个回文.现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 ...

  6. C语言趣味一百道 第25题 2017_12_24

    有道云笔记分享:http://note.youdao.com/noteshare?id=a7ce63b7663da27f916c91bd2ee976df&sub=09F84576ABB24FF ...

  7. 杭电acm 4823Energy Conversion(水题)

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. 最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂

    文章目录 前言 一.名称定义 1.最大公约数 2.辗转相除法 3.更相减损法 二.ACM杭电入门题 1.解题思路 三.解题参考代码(C语言,C++) 0.最优算法(C++) 1.辗转相除求解(C语言) ...

  9. 杭电1108java_按照这个步骤来刷题,迷茫的你两个月亦能成为王者

    原标题:按照这个步骤来刷题,迷茫的你两个月亦能成为王者 作者 | bigsai 来源 | bigsai(ID:bigsai) 前言 大家好,我是bigsai哥哥.最近很多小伙伴问我怎么入门数据结构与算 ...

最新文章

  1. Android studio安装与调试
  2. 【CTF】实验吧 古典密码
  3. 机器学习面试题集 - 如何进行 A/B 测试
  4. python编写IP地址与十进制IP转换脚本
  5. 解决“跨域问题”的几种方法
  6. Oracle-11g 基于 NBU 的 rman 冷备份及恢复
  7. python中loop的用法_python-在Tensorflow中使用tf.while_loop更新变量
  8. PHP学习笔记03:简单网上调查站点
  9. [转载] python中numpy库的使用举例
  10. Javascript封装
  11. Power Designer 概念数据模型导出 逻辑数据模型和物理数据模型 生成数据库脚本
  12. MATLAB理论力学应用
  13. sap 流程图 退货销售订单_销售订单_退货型
  14. 对你来说,哪一个深度学习网络是最佳选择?(2)
  15. Java程序员如何成为优秀的架构师
  16. 008 计算某一日是这一年的第几天
  17. 大数据学习笔记:聚类分析
  18. Oracle PLSQL单行数据的处理
  19. 计算机常用符号对应的英文
  20. 二叉树根结点到叶节点的最短距离

热门文章

  1. java-net-php-python-Java沈师周边美食资源管理系统计算机毕业设计程序
  2. 亮度不足 日本向12家LED销售企业下禁令
  3. Python——二进制16位加法器(采用手算二进制加法的过程实现)(tkinter实现)【2021-07-08】
  4. Matter Project 入门 – 构建和运行照明应用程序示例
  5. Paddle2.0实现中文新闻文本标题分类
  6. rfid中间件软件的应用实例_RFID原理与应用教与学(教学大纲)
  7. 附录3:RMA算法原理
  8. 晶硅太阳能发电 原理
  9. php关联规则,如何理解关联规则apriori算法
  10. 基于学术研究下载NOAA探空数据资料的详细步骤