[关闭]
@darkproject 2016-10-10T04:26:33.000000Z 字数 5950 阅读 1430

A - Lucky Division


英勇无敌的萌新
鸭子
分析:
列举4与7组合处理
代码如下:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int num;
  5. scanf("%d", &num);
  6. if (num % 4 == 0 || num % 7 == 0 || num % 47 == 0 || num % 74 == 0 || num % 474 == 0 || num % 477 == 0 || num % 447 == 0 || num % 744 == 0 || num % 774 == 0 || num % 747 == 0)
  7. {
  8. printf("YES");
  9. }
  10. else
  11. printf("NO");
  12. return 0;
  13. }

B - Lucky Substring


豆丁
分析:
寻找幸运数字4,7根据字典顺序,在一段输入中判断4与7个数,若个数相同则输出4,其余由谁多谁输出
代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. char str[55];
  6. scanf("%s", &str);
  7. int count4=0, count7=0;
  8. for (int i = 0; str[i] != '\0'; i++)
  9. {
  10. if (str[i] == '4')
  11. count4++;
  12. if (str[i] == '7')
  13. count7++;
  14. }
  15. if (count4 == 0 && count7 == 0)
  16. {
  17. cout << "-1\n";
  18. }
  19. else if (count4 >= count7)
  20. cout << "4\n";
  21. else if (count4 < count7)
  22. cout << "7\n";
  23. return 0;
  24. }

C - The number of positions



分析:
n个人的队伍,一个人去站队前面至少a人后面至多b人,问有多少种站队方法。可以通过确立前面至少的a人后,判断n-前面人数是否满足于后面必须有的b人,即n-i<=b
代码如下:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n, a, b;
  5. int count = 0;
  6. scanf("%d%d%d", &n, &a, &b);
  7. for (int i = a + 1; i <= n; ++i)
  8. if (n - i <= b)
  9. count++;
  10. printf("%d", count);
  11. return 0;
  12. }

D - Permutations


萌萌哒灵梦
分析:
n行k位正整数,允许有前导零,求解所有序列中最大值与最小值的最小可能。(变换第一个某2个数据位置后,其余数据都要按这个顺序进行变换)这道题呢萌新没有做出来,不过在国庆这段时间参考了一些代码,这题可以通过求出k!的排列然后判断。大部分都是通过搜索完所有序列进行判断。这里我曾听到果巨巨说过next_permutation这个函数,看了下题目觉得应该是用在这里(噗,记得自己写的时候写了要上百行啦,看了下别人风格最后优化可以很短),利用此函数可以很大程度上减少代码量。

ps:这个函数是求给定数组不按升序排列的最小字典序列,可以遍历完所有可能的序列直到无法找到下一个序列返回false。
参考函数:
template<class BidirectionalIterator>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last
);

代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. char str[10][9];
  4. int change[10];
  5. int main()
  6. {
  7. int n, k, result = 10000000000;
  8. int ma,mi;
  9. cin >> n >> k;
  10. for (int i = 0; i < k; ++i)
  11. change[i] = i;
  12. for (int i = 0; i < n; ++i)
  13. cin>>str[i];
  14. do
  15. {
  16. ma = -99999999, mi = 99999999;
  17. for (int i = 0; i < n; ++i)
  18. {
  19. int num = 0;
  20. for (int j = 0; j < k; ++j)
  21. {
  22. num = num * 10 + str[i][change[j]] - '0';
  23. }
  24. ma = max(ma, num);
  25. mi = min(mi, num);
  26. }
  27. result = min(ma - mi, result);
  28. } while (next_permutation(change, change + k));
  29. cout << result << endl;
  30. return 0;
  31. }

E - Wasted Time


666
分析:
这题大致就是一个好像非常叼的人给别人签名,求他浪费在签名上的时间,他签名速度为每秒50毫米。n代表签名所需的点的坐标个数,k代表他签了多少张签名。这里只要用2点间公式求出最短距离乘以k张纸最后除于他的速度可以得出正确答案。
ps:不要忘记规范精度
代码如下:

  1. #include<iostream>
  2. #include <iomanip>
  3. #include<cmath>
  4. using namespace std;
  5. int main()
  6. {
  7. int n, k;
  8. int x[105], y[105];
  9. double result = 0;
  10. cin >> n >> k;
  11. for (int i = 1; i <= n; ++i)
  12. cin >> x[i] >> y[i];
  13. for (int i = 1; i <= n-1; ++i)
  14. result += sqrt(pow(x[i] - x[i + 1], 2) + pow(y[i] - y[i + 1], 2));
  15. cout <<fixed<< setprecision(9) << result*k/50 << endl;
  16. return 0;
  17. }

F - Canvas Frames


mxr
分析:
一个画家准备画框,数据输入给出所有木棒长度,问可以组成多少个矩形画框。这些木棒不能合成和拆分,通过循环遍历判断。
代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int n, count = 0;
  6. int a[105];
  7. cin>> n;
  8. for (int i = 0; i < n; ++i)
  9. cin >> a[i];
  10. for(int i=0;i<n;++i)
  11. for(int j=i+1;j<n;++j)
  12. if (a[i] == a[j])
  13. {
  14. count++;
  15. a[j] = 999999 - j;
  16. break;
  17. }
  18. cout << count/2;
  19. return 0;
  20. }

G - Cookies


baka9
分析:
嗯这个题意呢,大致是一对姐妹有n袋饼干,第i袋饼干装有a(1 ≤ a ≤ 100).为了让她们不吵架,我们要取走其中一袋饼干,然后使剩下的饼干能够让她们平分(既满足偶数,包括0)。
代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int n, judge = 0;
  6. int count = 0;
  7. int data[105];
  8. cin >> n;
  9. for (int i = 1; i <= n; ++i)
  10. cin >> data[i];
  11. for (int i = 1; i <= n; ++i)
  12. {
  13. int temp = data[i];
  14. data[i] = 0;
  15. for (int i=n; i >0; --i)
  16. judge += data[i];
  17. if (judge % 2 == 0)
  18. count++;
  19. data[i] = temp;
  20. judge = 0;
  21. }
  22. cout << count;
  23. return 0;
  24. }

H - Students and Shoelaces


miku
分析:
不得不说,这题做法不算太难,但是题意比较难以理解。这里也是因为题意理解很久不能想通。题目主要是学生之间匹配,要保证不能存在学生只与另一个学生连接的情况,也就是学生的度不能为1。这题用图处理,学生作为点,连接带子作为边。还有比较重要的一点,关于一次操作的理解,一次操作指老师踢出所有度为1的学生,这记为一次操作。
采用二维数组记录连接关系,point数组存放学生。通过判断每次删点后(删点后,同时与他相连边也没啦)是否存在度为1的点来进行操作
代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. bool line[105][105];
  4. int point[105];
  5. int temp[105];
  6. int main()
  7. {
  8. //FILE *fp;
  9. //freopen_s(&fp,"d:\\hyx.txt", "r", stdin);
  10. memset(line, 0, sizeof(line));
  11. int n, m, a, b;
  12. int flag;
  13. int result = 0;
  14. cin >> n >> m;
  15. for (int i = 1; i <= m; ++i)
  16. {
  17. cin >> a >> b;
  18. point[a]++;
  19. point[b]++;
  20. line[a][b] = 1;
  21. line[b][a] = 1;
  22. }
  23. while (1)
  24. {
  25. flag = 0;
  26. int record = 1;
  27. for (int i = 1; i <= n; ++i)
  28. if (point[i] == 1)
  29. {
  30. point[i]--;
  31. temp[record++]=i;
  32. flag = 1;
  33. }
  34. if (!flag) break;
  35. for (int i = 1; i <record; ++i)
  36. for (int j = 1; j <= n; ++j)
  37. if (line[temp[i]][j])
  38. point[j]--;
  39. result++;
  40. }
  41. cout << result << endl;
  42. //fclose(stdin);
  43. return 0;
  44. }

I - cAPS lOCK


二小姐
分析:
题意大致是输入的一段字符串(1-100)中进行大小写分别转换。
转换情况:
1. 全为大写字母
2. 首位为小写字母,其余全为大写字母
代码如下:

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main()
  5. {
  6. char str[105];
  7. int count = 0;
  8. cin >> str;
  9. int judge = strlen(str);
  10. for (int i = 0; str[i] != '\0'; ++i)
  11. if (str[i] < 'a')
  12. count++;
  13. if (count == judge)
  14. for (int i = 0; i < judge; ++i)
  15. str[i] = str[i] + 32;
  16. else if (count == judge - 1)
  17. if (str[0] >= 'a')
  18. for (int i = 0; i < judge; ++i)
  19. {
  20. if (str[i] >= 'a')
  21. str[i] = str[i] - 32;
  22. else
  23. str[i] = str[i] + 32;
  24. }
  25. cout << str << endl;
  26. return 0;
  27. }

J - Opposites Attract


萌萌哒二小姐
分析:
求解输入数据存在多少组相反数(0自身互反),这道题很容易想到采用for循环处理,第一次进行时zz使用2个for循环O(n^2)处理最大数据10^5,导致直接T了。后来问了一个大大,建议采用c++ map关联容器记录数据次数,减少运算,一个for简单解决。
代码如下:

  1. #include<iostream>
  2. #include<map>
  3. using namespace std;
  4. map<int,int>x;
  5. int main()
  6. {
  7. int n,a;
  8. int t=0;
  9. cin>>n;
  10. for(int i=0;i<n;++i)
  11. {
  12. cin>>a;
  13. t+=x[-a];
  14. x[a]++;
  15. }
  16. cout<<t;
  17. return 0;
  18. }

K - The World is a Theatre


233

分析:
题意大致就是在确保男女规定人数n,m上任意组合成一个含t个人的队,有多少种组合方法。这里直接排列组合公式解决,嗯还有不要忘记考虑极限范围。
参考公式: C=
代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. long long com(int m, int n);
  4. int main()
  5. {
  6. int n, m, t;
  7. long long result = 0;
  8. cin >> n >> m >> t;
  9. for (int i = 4;i<=n; i++)
  10. for (int j = 1;j<=m; j++)
  11. if (i + j == t)
  12. result += com(n, i)*com(m, j);
  13. cout << result;
  14. return 0;
  15. }
  16. long long com(int m, int n)
  17. {
  18. int i, j;
  19. long long sum = 1;
  20. for (i = m, j = 0; j<n; j++, i--)
  21. {
  22. sum = sum*i / (j + 1);
  23. }
  24. return sum;
  25. }

M - HQ9+


huo
分析:
根据题意如果含有提示输出字符即为yes,唯一注意一点就是+不算在内。
代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. char str[105];
  6. cin >> str;
  7. int flag = 0;
  8. for (int i = 0; str[i] != '\0'; ++i)
  9. if (str[i] == 'H' || str[i] == 'Q' || str[i] == '9')
  10. {
  11. flag = 1;
  12. break;
  13. }
  14. if (flag)
  15. cout << "YES" << endl;
  16. else
  17. cout << "NO" << endl;
  18. return 0;
  19. }

N - Unary


萌兔
分析:
题中提供的每一个符号对应一个二进制数据,多个符号按输入顺序组成新的一个二进制数据。最后求解这个二进制数据所转化为的十进制数据。直接通过字符串连接方法和一个转换函数解决。不要忘记取余模,否则大数据无法处理。
代码如下:(直觉告诉我应该还有更更简单的方法QAQ)

  1. #include<iostream>
  2. #include<string>
  3. #include<cmath>
  4. using namespace std;
  5. #define M 1000003
  6. string judge(string str,int i);
  7. long long plan(int num[], int n);
  8. int main()
  9. {
  10. string str, strtemp;
  11. int num[10000];
  12. cin >> str;
  13. for (int i = 0; i != str.size(); ++i)
  14. strtemp += judge(str, i);
  15. for (int i = 0; i != strtemp.size(); ++i)
  16. num[i] = strtemp[strtemp.size() -i-1] - '0';
  17. cout <<plan(num, strtemp.size())%M<< endl;
  18. return 0;
  19. }
  20. string judge(string str,int i)
  21. {
  22. if (str[i]== '>')
  23. return "1000";
  24. if (str[i] == '<')
  25. return "1001";
  26. if (str[i] == '+')
  27. return "1010";
  28. if (str[i] == '-')
  29. return "1011";
  30. if (str[i] == '.')
  31. return "1100";
  32. if (str[i] == ',')
  33. return "1101";
  34. if (str[i] == '[')
  35. return "1110";
  36. if (str[i] == ']')
  37. return "1111";
  38. }
  39. long long plan(int num[],int n)
  40. {
  41. long long result = 0;
  42. long long ji= 1;
  43. for (int i = 0; i < n; ++i)
  44. {
  45. result = (result + num[i] * ji)%M;
  46. ji =ji* 2%M;
  47. }
  48. return result;
  49. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注