• Codeforces Round #350 (Div. 2) A B C D1 D2 水题【D2 【二分+枚举】好题】


    A. Holidays

    题意:一个星球 五天工作,两天休息。给你一个1e6的数字n,问你最少和最多休息几天。
    思路:我居然写成模拟题QAQ。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 //#define int long long
     5 
     6 signed main(){
     7     int n;
     8     cin>>n;
     9     if(n%7==0){
    10         int x=n/7;x*=2;
    11         cout<<x<<" "<<x;
    12         return 0;
    13     }
    14     int ans1=0;
    15     int ans2=0;
    16     int i=1;
    17     int temp=n;
    18     while(1){
    19         if(temp<=0)
    20             break;
    21         if(i%2)
    22             temp-=5;
    23         else{
    24             ans1+=min(temp,2);temp-=min(temp,2);
    25         }
    26         i++;
    27         if(temp<=0)
    28             break;
    29     }
    30      i=1;
    31      temp=n;
    32     while(1){
    33         if(temp<=0)
    34             break;
    35         if(i%2==0)
    36             temp-=5;
    37         else
    38             ans2+=min(temp,2),temp-=min(temp,2);
    39         i++;
    40         if(temp<=0)
    41             break;
    42     }
    43     cout<<ans1<<" "<<ans2;
    44     return 0;
    45 }
    46 /*
    47 6
    48 1 2
    49 7
    50 2 2
    51 8
    52 2 3
    53 9
    54 2 4
    55 
    56 */

    B. Game of Robots

    题意:第一个机器人报自己的编号;第二个报前一个机器人和自己的编号;第三个机器人报前两个机器人和自己的编号。以此类推。
    每个机器人一个编号。问k个报什么。

    思路:简化M的值。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include<bits/stdc++.h>
     5 using namespace std;
     6 #define int unsigned long long
     7 #define N 1500050
     8 int arr[N];
     9 
    10 signed  main(){
    11     int n,m;
    12     cin>>n>>m;
    13     
    14     for(int i=1;i<=n;i++){
    15         cin>>arr[i];
    16     
    17         if(m<=i){
    18             continue;
    19         }else{
    20                 m-=i;
    21         }
    22     }
    23     cout<<arr[m];
    24     return 0;
    25 }

    C. Cinema


    题意:有n个人,每个人只会一种语言(不同编号表不同语言)。
    现在有m部电影,每部电影的声音是a[i],字幕是b[i]。(a[i]输入完输入b[i])
    如果听得懂声音,他会非常满意,如果字幕他能看懂的话他会比较满意,否则它很不满意。
    现在问看哪部电影会使得n个人满意最高(如果两部电影使n个人非常满意的人数相同时,选比较满意的最多的)。

    思路:看了一些大佬的博客,都是用离散化。可是菜菜的我不会离散化QAQ。结果用个哈希MAP。居然水过。unordered_map<int,int> mp是个好东西。。。。。。。。。。。

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 #define int long long
     5 struct str{
     6     int x,y,id;
     7 }st[300900];
     8 unordered_map<int,int> mp;
     9 bool cmp(str a,str b){
    10     if(mp[a.x]!=mp[b.x]){
    11         return mp[a.x]>mp[b.x];
    12     }else{
    13         return mp[a.y]>mp[b.y];
    14     }
    15 }
    16 signed main(){
    17     int n;
    18     cin>>n;
    19     for(int i=1;i<=n;i++){
    20         int temp;
    21         scanf("%lld",&temp);
    22         mp[temp]++;
    23     }
    24     int m;
    25     cin>>m;
    26     for(int i=1;i<=m;i++){
    27         scanf("%lld",&st[i].x);
    28         st[i].id=i;
    29     }
    30     for(int i=1;i<=m;i++){
    31         scanf("%lld",&st[i].y);
    32     }
    33     sort(st+1,st+1+m,cmp);
    34     cout<<st[1].id;
    35     return 0;
    36 } 

    D1. Magic Powder

    题意:做一个蛋糕需要n个原材料,现有k个魔法材料,魔法材料可以替代成任何材料,现在告诉你蛋糕每个材料需要多少,以及你现在有多少个,问你最多能够做出多少个蛋糕来。

    思路:看了一下数据范围,然后开始暴力。

    AC代码:

     1 /*
     2 
     3 10 926
     4 5 6 8 1 2 5 1 8 4 4
     5 351 739 998 725 953 970 906 691 707 1000
     6 */
     7 #include<bits/stdc++.h>
     8 
     9 using namespace std;
    10 #define int long long
    11 map<int,int> mp;
    12 int arr[2500];
    13 signed main(){
    14     int n,m;
    15     cin>>n>>m;
    16     int temp;
    17     for(int i=1;i<=n;i++){
    18         scanf("%lld",&temp);
    19         mp[i]=temp;
    20     }
    21     for(int i=1;i<=n;i++){
    22         scanf("%lld",&arr[i]);
    23     }
    24     int ans=0;
    25     while(1){
    26         int flag=1;
    27         for(int i=1;i<=n;i++){
    28             if(arr[i]>=mp[i]){
    29                 arr[i]-=mp[i];
    30             }else{
    31                 int x=mp[i]-arr[i];
    32                 if(x<=m){
    33                     m-=x;
    34                     arr[i]+=x;  
    35                     arr[i]-=mp[i];
    36                 }else{
    37                     flag=0;
    38                     break;
    39                 }
    40             }
    41         }
    42         if(flag){
    43             ans++;
    44         }else{
    45             break;
    46         }       
    47     }
    48     cout<<ans;
    49     
    50     return 0;
    51 }

    D2. Magic Powder

    二分做法。感觉以前做过类似的题目。

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 #define N 190000
     5 #define int unsigned long long 
     6 int n,k;
     7 int arr[N];
     8 int vis[N];
     9 signed main(){
    10     scanf("%lld%lld",&n,&k);
    11     for(int i=1;i<=n;i++)
    12     {
    13         int temp;
    14         scanf("%lld",&temp);
    15         vis[i]=temp;
    16     }
    17     for(int i=1;i<=n;i++)
    18     {
    19         scanf("%lld",&arr[i]);
    20     }
    21     int l=0;
    22     int r=9000000000;
    23     while(l<=r){
    24         int mid=(l+r)/2;
    25         int sum=0;
    26         for(int i=1;i<=n;i++){
    27             if(arr[i]<vis[i]*mid){
    28                 sum+=vis[i]*mid-arr[i];
    29             }
    30             if(sum>k){
    31                 break;
    32             }
    33         }
    34         if(sum==k){
    35             cout<<mid;
    36             return 0;
    37         }else if(sum<k){
    38             l=mid+1;
    39         }else{
    40             r=mid-1;
    41         }
    42     }
    43     cout<<l-1; 
    44     return 0;
    45 }
  • 相关阅读:
    然乌湖
    邦达 八宿
    芒康
    巴塘
    禾尼乡 所波大叔
    世界高城 理塘
    相克宗 藏民家
    骑行川藏--新都桥&塔公草原
    d 3
    D2
  • 原文地址:https://www.cnblogs.com/pengge666/p/11607757.html
Copyright © 2020-2023  润新知