title: ACM-NEFU15届校赛-大一组
tags:

  • ACM
  • NEFU
    abbrlink: ba287589
    date: 2020-12-09 17:30:22

A. 三角形面积

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. double a,b,c;
  6. double ans,p,tmp;
  7. cin>>a>>b>>c;
  8. p=(a+b+c)*0.5;
  9. tmp=p*(p-a)*(p-b)*(p-c);
  10. ans=sqrt(tmp);
  11. printf("%.1lf", ans);
  12. return 0;
  13. }

B. 最大质因子

唯一分解定理

唯一分解定理又称为算数基本定理,基本内容是:

每个大于1的自然数,要么本身就是质数,要么可以写为2个或以上的质数的积,而且这些质因子按大小排列之后,写法仅有一种方式。

用另一种方法表示就是:

对于任何一个大于1的正整数,都存在一个标准的分解式: N=p1^a1 * p2an;(其中一系列an为指数,pn为质数)

此定理表明:任何一个大于 1 的正整数都可以表示为素数的积。

然而这道题纯暴力就可解…

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+10;
  4. bool judge(int a)
  5. {
  6. int flag=1;
  7. for (int i=2;i*2<=a;i++)
  8. if (a%i==0) {flag=0; break; }
  9. if (a==1) return 0;
  10. else return flag;
  11. }
  12. int main()
  13. {
  14. int a;
  15. while(cin>>a)
  16. {
  17. for (int i=a;i>=1;i--)
  18. {
  19. if (a%i==0)
  20. if (judge(i))
  21. {
  22. cout<<i<<endl;
  23. break;
  24. }
  25. }
  26. }
  27. return 0;
  28. }

C.杨辉三角

模板例题

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[21][21];
  4. int main()
  5. {
  6. memset(a, 0, sizeof(a));
  7. a[1][1]=1;
  8. a[2][1]=a[2][2]=1;
  9. int n;
  10. cin>>n;
  11. for(int i=3;i<=n;i++)//行
  12. {
  13. for(int j=1;j<=i;j++)
  14. {
  15. if(j==1 || j==i)
  16. {
  17. a[i][j]=1;continue;
  18. }
  19. a[i][j]=a[i-1][j-1]+a[i-1][j];
  20. }
  21. }
  22. for(int i=1;i<=n;i++)
  23. {
  24. for(int j=1;j<=i;j++)
  25. {
  26. cout<<a[i][j]<<" ";
  27. }
  28. cout<<endl;
  29. }
  30. return 0;
  31. }

D.”nefu”的数目

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. string s;
  6. int scount(int p)
  7. {
  8. int sum=0;
  9. int len=s.length();
  10. for(int i=p+1;i<len;i++)
  11. {
  12. if(s[i]=='e')
  13. {
  14. for(int j=i+1;j<len;j++)
  15. {
  16. if(s[j]=='f')
  17. {
  18. for(int k=j+1;k<len;k++)
  19. {
  20. if(s[k]=='u') sum++;
  21. //cout<<sum<<endl;
  22. }
  23. }
  24. }
  25. }
  26. }
  27. return sum;
  28. }
  29. int main()
  30. {
  31. int ans=0,flag=0;
  32. cin>>s;
  33. int len=s.length();
  34. //cout<<len;
  35. for(int i=0;i<len;i++)
  36. {
  37. if(s[i]=='n')
  38. {
  39. ans+=scount(i);
  40. }
  41. //cout<<ans<<endl;
  42. }
  43. cout<<ans<<endl;
  44. return 0;
  45. }

E. 最少修改次数(1)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=2e5+10;
  4. int main()
  5. {
  6. string s,t;
  7. while(cin>>s)
  8. {
  9. cin>>t;
  10. int ct=0;
  11. int nums=s.size(),numt=t.size();
  12. int min=1111;
  13. for (int i=0;i<=nums-numt;i++)
  14. {
  15. int j=0;
  16. ct=0;
  17. for (int k=i;k<=i+numt-1;k++)
  18. {
  19. if (s[k]!=t[j]) ct++;
  20. j++;
  21. }
  22. if (ct<min) min=ct;
  23. }
  24. cout<<min<<endl;
  25. }
  26. return 0;
  27. }

F.字典序

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=2e5+10;
  4. int main()
  5. {
  6. int n;
  7. while(cin>>n)
  8. {
  9. string s1,s,max="0";
  10. for (int i=1;i<=n;i++)
  11. {
  12. int m=i;
  13. s.clear(); s1.clear();
  14. while(m!=0)
  15. {
  16. s+=m%8+'0';
  17. m/=8;
  18. }
  19. for (int j=s.size()-1;j>=0;j--)
  20. {
  21. s1+=s[j];
  22. }
  23. if (s1>max) max=s1;
  24. }
  25. cout<<max<<endl;
  26. }
  27. return 0;
  28. }

G.最小差值

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=2e5+10;
  4. int a[maxn];
  5. int main()
  6. {
  7. int n,tot=0;
  8. cin>>n;
  9. for(int i=0;i<n;i++)
  10. {
  11. cin>>a[i];
  12. tot+=a[i];
  13. }
  14. long long sum=0,ans=999999;
  15. for(int i=0;i<n;i++)
  16. {
  17. long long com;
  18. sum+=a[i];
  19. com=tot-sum;
  20. ans=min(ans, abs(com-sum));
  21. }
  22. cout<<ans;
  23. return 0;
  24. }

H.染色方案(待补)

I.最大正方形

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a[1000+5];
  7. int n;
  8. cin>>n;
  9. for(int i=1;i<=n;i++)
  10. {
  11. cin>>a[i];
  12. }
  13. sort(a+1, a+1+n);
  14. int ans=0;
  15. for(int i=n;i>=1;i--)
  16. {
  17. if(a[i]>=ans+1)
  18. {
  19. ans++;
  20. }
  21. else break;
  22. }
  23. cout<<ans;
  24. return 0;
  25. }

J.最大值

注意:此题用C++输入输出会超时

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. const int MAXN=2e5+10;
  5. int a[MAXN];
  6. int times=0;
  7. int main()
  8. {
  9. int n;
  10. while(cin>>n)
  11. {
  12. int maxn=0,next=0;
  13. for(int i=0;i<n;i++)
  14. {
  15. scanf("%d", &a[i]);
  16. maxn=max(maxn, a[i]);
  17. }
  18. for(int i=0;i<n;i++)
  19. {
  20. if(a[i]==maxn)
  21. {
  22. times++;
  23. continue;
  24. }
  25. next=max(next, a[i]);
  26. }
  27. for(int i=0;i<n;i++)
  28. {
  29. if(a[i]>=maxn && times<=1)
  30. {
  31. printf("%d\n", next);
  32. }
  33. else
  34. {
  35. printf("%d\n", maxn);
  36. }
  37. }
  38. }
  39. return 0;
  40. }

K.循环排列(待补)

L.库特与围棋(待补)