• Codeforces Round 901 (Div. 2)


    Problem - A - Codeforces

    贪心

    每次都先让b减到1,然后再去选择工具来增加时间

    AC代码:

    1. #include
    2. #define endl '\n'
    3. #define int long long
    4. using namespace std;
    5. const int N=110;
    6. int x[N];
    7. int a,b,n;
    8. void solve() {
    9. cin>>a>>b>>n;
    10. for(int i=1;i<=n;i++) cin>>x[i];
    11. sort(x+1,x+1+n);
    12. int ans=0;
    13. for(int i=1;i<=n;i++){
    14. ans+=b-1;
    15. b=1;
    16. b=min(b+x[i],a)-1;
    17. ans++;
    18. }
    19. ans+=b;
    20. cout<
    21. }
    22. signed main() {
    23. ios::sync_with_stdio(false);
    24. cin.tie(0);
    25. cout.tie(0);
    26. int t=1;
    27. cin>>t;
    28. while(t--) {
    29. solve();
    30. }
    31. return 0;
    32. }

    Problem - B - Codeforces

    一开始只记录a,b的最小值和最大值,没有考虑到a的最小值去换b的最大值,然后b的最小值去换a的最大值时可能b的最小值不是刚换过来的a的最小值

    1. #include
    2. #define endl '\n'
    3. #define int long long
    4. using namespace std;
    5. const int N=55;
    6. int a[N],b[N];
    7. int n,m,k;
    8. void solve() {
    9. cin>>n>>m>>k;
    10. int mina=2e9,minb=2e9;
    11. int maxa=0,maxb=0;
    12. int ans=0;
    13. for(int i=1;i<=n;i++){
    14. cin>>a[i];
    15. ans+=a[i];
    16. mina=min(mina,a[i]);
    17. maxa=max(maxa,a[i]);
    18. }
    19. for(int i=1;i<=m;i++){
    20. cin>>b[i];
    21. minb=min(minb,b[i]);
    22. maxb=max(maxb,b[i]);
    23. }
    24. if(mina>=maxb){
    25. if(k%2==0) ans=ans-maxa+minb;
    26. }
    27. else{
    28. if(k%2==1) ans=ans-mina+maxb;
    29. }
    30. cout<
    31. }
    32. signed main() {
    33. ios::sync_with_stdio(false);
    34. cin.tie(0);
    35. cout.tie(0);
    36. int t=1;
    37. cin>>t;
    38. while(t--) {
    39. solve();
    40. }
    41. return 0;
    42. }

    最优策略就是用最小值去换最大值

    可以模拟第一回合和第二回合的情况,这样就涵盖了所有的情况了,当k为奇数时,和第一回合答案一样,当k为偶数时,和第二回合答案一样

    AC代码:

    1. #include
    2. #define endl '\n'
    3. #define int long long
    4. using namespace std;
    5. const int N=55;
    6. int a[N],b[N];
    7. int n,m,k;
    8. void solve() {
    9. cin>>n>>m>>k;
    10. int ans1=0,ans2=0;
    11. for(int i=1;i<=n;i++) cin>>a[i];
    12. for(int i=1;i<=m;i++) cin>>b[i];
    13. sort(a+1,a+1+n);
    14. sort(b+1,b+1+m);
    15. if(a[1]
    16. swap(a[1],b[m]);
    17. sort(a+1,a+1+n);
    18. sort(b+1,b+1+m);
    19. }
    20. for(int i=1;i<=n;i++) ans1+=a[i];
    21. if(b[1]swap(b[1],a[n]);
    22. for(int i=1;i<=n;i++) ans2+=a[i];
    23. if(k%2==1) cout<
    24. else cout<
    25. }
    26. signed main() {
    27. ios::sync_with_stdio(false);
    28. cin.tie(0);
    29. cout.tie(0);
    30. int t=1;
    31. cin>>t;
    32. while(t--) {
    33. solve();
    34. }
    35. return 0;
    36. }

    Problem - C - Codeforces

    如果用小数做的话,由于数过于大,会有精度问题

    错误代码:

    1. #include
    2. #define endl '\n'
    3. #define int long long
    4. using namespace std;
    5. int n,m;
    6. void solve() {
    7. cin>>n>>m;
    8. if(n%m==0){
    9. cout<<0<
    10. return;
    11. }
    12. if(n>m) n%=m;
    13. double x=(double)n/m;
    14. double y=0.5;
    15. if(xswap(x,y);
    16. double diff;
    17. if(x!=y) diff=x-y;
    18. else diff=x;
    19. while(diff>0.5){
    20. if(xswap(x,y);
    21. diff=x-y;
    22. x-=y;
    23. }
    24. double d=0.5;
    25. while(d>0){
    26. d-=diff;
    27. }
    28. if(d!=0){
    29. cout<<-1<
    30. return;
    31. }
    32. int cnt=0;
    33. for(double i=1;;i/=2){
    34. if(i==diff) break;
    35. cnt++;
    36. }
    37. int ans=0;
    38. for(int i=1;i<=cnt-1;i++){
    39. ans+=n;
    40. n*=2;
    41. }
    42. ans+=m/2;
    43. cout<
    44. }
    45. signed main() {
    46. ios::sync_with_stdio(false);
    47. cin.tie(0);
    48. cout.tie(0);
    49. int t=1;
    50. cin>>t;
    51. while(t--) {
    52. solve();
    53. }
    54. return 0;
    55. }

    f(n,m)表示n个苹果均分给m个人的次数

    由于m最大1e9,n最小为1,所以最多log1e9次,大概30次

    AC代码:

    1. #include
    2. #define endl '\n'
    3. #define int long long
    4. using namespace std;
    5. int n,m;
    6. void solve() {
    7. cin>>n>>m;
    8. n%=m;
    9. int ans=0;
    10. int cnt=0;
    11. while(n){
    12. ans+=n;
    13. n*=2;
    14. n%=m;
    15. cnt++;
    16. if(cnt>30) break;
    17. }
    18. if(n%m){
    19. cout<<-1<
    20. return;
    21. }
    22. cout<
    23. }
    24. signed main() {
    25. ios::sync_with_stdio(false);
    26. cin.tie(0);
    27. cout.tie(0);
    28. int t=1;
    29. cin>>t;
    30. while(t--) {
    31. solve();
    32. }
    33. return 0;
    34. }
  • 相关阅读:
    护照识别易语言代码
    三、T100应付管理之采购应付-入库应付管理篇
    Rust开发——切片(slice)类型
    C# wpf 实现截屏框热键截屏功能
    R语言和医学统计学(13):协方差分析
    Linux 忘记密码解决方法
    引用类型详解
    基于微信小程序的在线商城设计(后台PHP)
    web前端期末大作业:JavaScript大作业——福五鼠动漫网页制作(6页)带轮播图效果 学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作
    SortedSet 和 List 异同点
  • 原文地址:https://blog.csdn.net/m0_74087709/article/details/133514107