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