• Educational Codeforces Round 115 (Rated for Div. 2)


    目录

    A. Computer Game

    B. Groups

    C. Delete Two Elements

    D. Training Session


    A. Computer Game

    Problem - A - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1598/problem/A题意:有一个2行n列的地图,我们要从(1,1)走到(2,n).只能走法满足|x1−x2|≤1 && |y1−y2|≤1(1为原来的位置,2为新位置).

    思路,只要不会有一列都是1就可以走到.

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. #define int long long
    13. using namespace std;
    14. const int N =5e5+10,mod=998244353;
    15. void solve()
    16. {
    17. string s1,s2;
    18. int n;
    19. cin>>n;
    20. cin>>s1>>s2;
    21. for(int i=0;i<n;i++)
    22. {
    23. if(s1[i]==s2[i]&&s1[i]=='1')
    24. {
    25. cout<<"NO\n";
    26. return ;
    27. }
    28. }
    29. cout<<"YES\n";
    30. return ;
    31. }
    32. signed main()
    33. {
    34. int t;
    35. cin>>t;
    36. while(t--)
    37. solve();
    38. return 0;
    39. }

    B. Groups

    Problem - B - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/contest/1598/problem/B题意:有n个学生,分成相等的两组(n%2==0),保证两组在不同的两天内都可以上课.给定一个矩阵,1表示他们今天可以上课.问可不可以分出来.

    思路:思路不太好说,直接看代码:

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. using namespace std;
    13. const int N =5e5+10,mod=998244353;
    14. int a[1024][6];
    15. void solve()
    16. {
    17. int n;
    18. scanf("%d",&n);
    19. for(int i=1;i<=n;i++)
    20. for(int j=1;j<=5;j++)
    21. scanf("%d",&a[i][j]);
    22. for(int i=1;i<=5;i++)
    23. {
    24. for(int j=i+1;j<=5;j++)
    25. {
    26. int cnt1=0,cnt2=0,f=0;
    27. for(int k=1;k<=n;k++)
    28. {
    29. if((a[k][i]|a[k][j])==0)
    30. {
    31. f=1;
    32. break;
    33. }
    34. if(a[k][i]==1)
    35. cnt1++;
    36. if(a[k][j]==1)
    37. cnt2++;
    38. }
    39. if(f==1)
    40. continue;
    41. if(cnt1>=n/2&&cnt2>=n/2)
    42. {
    43. printf("YES\n");
    44. return ;
    45. }
    46. }
    47. }
    48. printf("NO\n");
    49. return ;
    50. }
    51. signed main()
    52. {
    53. int t;
    54. cin>>t;
    55. while(t--)
    56. solve();
    57. return 0;
    58. }

    C. Delete Two Elements

    Problem - C - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1598/problem/C题意:你从n个数的数组里删除两个数,保证平均数不变,有多少种删除方法.

    我们只需要一边遍历边用map记录这个数出现的次数,用之前求的平均数*2减去当前遍历到的数,如果map存在中存在这个结果,就说明可以进行删除,直接和前面出现的进行组合即可.

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. #define int long long
    13. using namespace std;
    14. map<double,int>ma;
    15. double a[200005];
    16. void solve()
    17. {
    18. ma.clear();
    19. int n,ans=0;
    20. double sum=0;
    21. scanf("%lld",&n);
    22. for(int i=1;i<=n;i++)
    23. scanf("%lf",&a[i]),sum+=a[i];
    24. double avg=(double)sum/n;
    25. for(int i=1;i<=n;i++)
    26. {
    27. double temp=avg*2-a[i];
    28. if(ma.count(temp))
    29. ans+=(ma[temp]);
    30. ma[a[i]]++;
    31. }
    32. printf("%lld\n",ans);
    33. return ;
    34. }
    35. signed main()
    36. {
    37. int t;
    38. cin>>t;
    39. while(t--)
    40. solve();
    41. return 0;
    42. }

    D. Training Session

    Problem - D - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1598/problem/D

    题意:给你n个任务,都包含有一个a值和一个b值.选择三个任务,这三个任务要满足两个条件中的一个:1.a要互不相同.2.b要互不相同.问有多少种选法.

    思路:如果直接按照条件去求,太难了,卡了我半天,不妨用容斥的思想,算出所有的选三种的方法,再减去非法的选法即可.非法的选法一定如下所示

    a b

    a y

    x b    (x,y可以为任意值)

    所以我们就可以对于每一个任务的a,b再去进行选一个包含a的任务和一个包含b的任务.可以开两个map进行记录,在遍历直接进行计算:

    1. #include<map>
    2. #include<cmath>
    3. #include<set>
    4. #include<queue>
    5. #include<string>
    6. #include<vector>
    7. #include<cstring>
    8. #include<iostream>
    9. #include<algorithm>
    10. #include<unordered_set>
    11. #include<unordered_map>
    12. #define int long long
    13. using namespace std;
    14. map<int,int>ma,ma1;
    15. int a[200005];
    16. int b[200005];
    17. void solve()
    18. {
    19. ma.clear();
    20. ma1.clear();
    21. int n,ans;
    22. scanf("%lld",&n);
    23. ans=n*(n-1)*(n-2)/2/3;
    24. for(int i=1;i<=n;i++)
    25. {
    26. scanf("%lld%lld",&a[i],&b[i]);
    27. ma[a[i]]++;
    28. ma1[b[i]]++;
    29. }
    30. for(int i=1;i<=n;i++)
    31. {
    32. ans-=(ma[a[i]]-1)*(ma1[b[i]]-1);
    33. }
    34. printf("%lld\n",ans);
    35. return;
    36. }
    37. signed main()
    38. {
    39. int t;
    40. cin>>t;
    41. while(t--)
    42. solve();
    43. return 0;
    44. }

    斗奋力努!

  • 相关阅读:
    万字长文,冲刺备战金九银十,奉上[Java一线大厂高岗面试题解析合集]
    Day36PHPcookie和session
    408强化(番外)文件管理
    树型结构和二叉树的概念及特性
    Ftrans自动同步软件:满足企业级数据同步的需求
    c# Class vs Structure
    想要精通算法和SQL的成长之路 - 可以攻击国王的皇后
    BeautifulSoup4库
    【编程题】【Scratch四级】2021.03 绳子算法
    指针进阶2
  • 原文地址:https://blog.csdn.net/qq_49593247/article/details/125569823