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

夙愿已清 提交于 2019-12-03 20:46:31

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\n");
18         } else{
19             printf("NO\n");
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("\n");
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\n");
27         return 0;
28     }
29     printf("YES\n"); 
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("\n");
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("\n");
52         
53     }
54     return 0;
55 } 
56  
57 /*
58 11011010
59 01111010
60 */

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

一场掉了分的DIV3。。。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!