• Codeforces Round #598 (Div. 3) A,B,C,D{E,F待补}


    A. Payment Without Change

     

     1 #include<bits/stdc++.h>
     2  
     3 using namespace std;
     4 #define int long long
     5 #define N 100500
     6 int arr[N];
     7 signed main(){
     8     int _;
     9     cin>>_;
    10     while(_--){
    11         int a,b,n,s;
    12         cin>>a>>b>>n>>s;
    13         int y=s/n;
    14         int x=min(a,y);
    15         s-=x*n;
    16         if(b>=s){
    17             printf("YES
    ");
    18         } else{
    19             printf("NO
    ");
    20         }
    21     }
    22     return 0;
    23 } 

    B. Minimize the Permutation

    按照题意暴力就行。从1到n枚举,每个数尽量地往前和比他大的数交换。并且保证相邻的位置只能换一次。【比赛·的时候读错题意,还想错了思路QAQ难受====】

     1 #include<bits/stdc++.h>
     2  
     3 using namespace std;
     4 #define int long long
     5 #define N 150
     6 int arr[N];int vis[N];
     7 signed main(){
     8     int _;
     9     cin>>_;
    10     while(_--){
    11         
    12         int n;cin>>n;
    13         for(int i=1;i<=n;i++)
    14             cin>>arr[i];
    15         int m=n-1;
    16         while(1){
    17             int flag=0;
    18             for(int i=n-1;i>=1;i--){
    19                 if(vis[i])
    20                     continue;
    21                 if(arr[i]>arr[i+1]){
    22                     int t=arr[i];
    23                     arr[i]=arr[i+1];
    24                     arr[i+1]=t;
    25                     m--;
    26                     flag=1;
    27                     vis[i]=1;
    28                     if(m<=0){
    29                         break;
    30                     }
    31                 }
    32             }
    33             if(m<=0){
    34                 break;
    35             }
    36             if(!flag){
    37                 break;
    38             }
    39         }
    40         for(int i=1;i<=n;i++){
    41             printf("%lld ",arr[i]);
    42         }
    43         
    44         printf("
    ");
    45         for(int i=0;i<=n+1;i++)
    46             arr[i]=vis[i]=0;
    47     }
    48     return 0;
    49 }

    C. Platforms Jumping(贪心)【补题】

    贪心:在板之间加水。这样保证了所有的板都用上了。最后再特盘一个不能到达的情况即可。开始模拟。【这题调了一会BUG,好久没刷题的,代码都打不清楚了QAQQAQQAQ】

     1 #include<bits/stdc++.h>
     2  
     3 using namespace std;
     4 #define int long long
     5 #define N 150000
     6 int arr[N];int n,m,k;
     7 int c[N];
     8 struct str{
     9     int id;
    10     int length; 
    11 }st[N];
    12  
    13 signed main(){
    14     cin>>n>>m>>k;
    15     int Sum=0;
    16     int POS=0;
    17     for(int i=1;i<=m;i++){
    18         POS+=k;
    19         scanf("%lld",&st[i].length);
    20         st[i].id=i;
    21         POS+=st[i].length-1;
    22         Sum+=st[i].length;
    23     }
    24     POS+=k;
    25     if(POS<n+1){
    26         printf("NO
    ");
    27         return 0;
    28     }
    29     printf("YES
    "); 
    30     int tot=n-Sum;
    31     int flag=0;
    32     int dis=k-1;int now=0;
    33     int pos=0; 
    34     //out<<tot<<endl;
    35     for(int i=1;i<=m;i++){
    36         if(flag==0){
    37             int temp=min(dis,tot);
    38             tot-=temp;
    39             if(tot<=0){
    40                 flag=1;
    41             }
    42             while(temp--)
    43                 arr[++now]=0;
    44             temp=st[i].length;
    45            // Sum-=temp;
    46             while(temp--)
    47                 arr[++now]=i;
    48         }else{
    49             int _;_=st[i].length;
    50             while(_--)
    51                 arr[++now]=i;
    52         }   
    53         if(now>=n+1){
    54             break;
    55         } 
    56     }
    57     for(int i=1;i<=n;i++)
    58         cout<<arr[i]<<" ";
    59     printf("
    ");
    60     
    61     return 0;
    62 }

    D. Binary String Minimizing(贪心)

    从左到右每个0依次和当前最左边的1交换,消耗这两个数下标之差的交换次数。

    如果次数不够用,就让这个0和最远的能交换的1交换位置。

    直接模拟就行。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define int long long
     4 signed main(){
     5     int _;
     6     cin>>_;
     7     while(_--){
     8         int left=0;
     9         int n,m;cin>>n>>m;string str;cin>>str;
    10         for(int i=0;i<str.size();i++){
    11             if(str[i]=='1'){
    12                 left=i;
    13                 break;
    14             }
    15         }
    16         for(int i=0;i<str.size();i++){
    17             if(str[i]=='0'&&i!=0){
    18                 while(str[left]!='1'&&left<str.size())
    19                     left++;
    20                 if(left<i){
    21                     
    22                 
    23                 if(m>=(i-left)){
    24                     m-=(i-left);
    25                     str[left]='0';
    26                     str[i]='1';
    27                 }else{
    28                     str[i-m]='0';
    29                     str[i]='1';
    30                     m=0;
    31                 }
    32                 if(m<=0){
    33                     break;
    34                 }
    35                 }
    36             }
    37         }
    38         cout<<str<<endl;
    39     }
    40     return 0;
    41 }

    用vector记录0的位置,然后模拟

     1 #include<bits/stdc++.h>
     2  
     3 using namespace std;
     4 #define int unsigned long long
     5 #define N 1000500
     6 int vis[N];
     7 vector<int> v;
     8 signed main(){
     9     int _;
    10     cin>>_;
    11     while(_--){
    12         int n,m;
    13         cin>>n>>m;string str;
    14         v.clear();cin>>str;
    15         int left=0;
    16         int sum0=0;int sum1=0;
    17         for(int i=0;i<str.size();i++){    
    18             if(str[i]=='0'){
    19                 if(m>=(i-left)){
    20                     m-=(i-left);
    21                     sum0++;
    22                     left++;
    23                 }else{
    24                     
    25                     if(m){
    26                     v.push_back(i-m);m=0;
    27                     }else{
    28                         v.push_back(i);
    29                     }
    30                 }
    31             }else{
    32                 sum1++;
    33             }
    34         }
    35         int len=v.size();
    36         for(int i=0;i<sum0;i++){
    37             cout<<"0";
    38         }int cnt=0;
    39         for(int i=sum0;i<n;i++){
    40             if(cnt<len){
    41                 if(v[cnt]==i){
    42                 cout<<"0";
    43                 cnt++;
    44                 }else{
    45                     cout<<"1";
    46                 }
    47             }else{
    48                 cout<<"1"; 
    49             }
    50         }
    51         printf("
    ");
    52         
    53     }
    54     return 0;
    55 } 
    56  
    57 /*
    58 11011010
    59 01111010
    60 */

    E,F待补。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    一场掉了分的DIV3。。。

  • 相关阅读:
    1031.查询-集合操作
    1030.查询-select子句
    1029.查询-复杂分组grouping子句
    1028.查询-group by和having子句
    1027.查询-where子句
    1026.查询-from子句2
    1025.查询-from子句
    1024.查询-概述
    1023.表-数据操作
    图片隐写之stegsolve使用(转载)
  • 原文地址:https://www.cnblogs.com/pengge666/p/11808312.html
Copyright © 2020-2023  润新知