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。。。