Codeforces Round #590 (Div. 3)

------------恢復內容開始------------ios

從今天開始我要天天都要作一波div3來提升本身的思惟,,,,ide

傳送門spa

A題3d

題意:給你a個n元的,b個1元的硬幣,問你可不能夠組成S元code

思路:就是看看s最大能夠用幾個n元的,剩下的都要用一元的來補blog

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 
 6 using namespace std;
 7 int main()
 8 {
 9     int q;
10    scanf("%d",&q);
11     while(q--)
12     {
13         int a,b,n,s;
14         scanf("%d%d%d%d",&a,&b,&n,&s);
15         int d = s/n;
16         int p = s - min(d,a)*n;
17         if(b>=p){
18             printf("YES\n");
19         }
20         else{
21             printf("NO\n");
22         }
23     }
24 }
手速

B題ci

題意:給你n個數,你能夠進行n-1次(前提每一個i位置的操做,只有一次,也就是能夠從1——n-1每一個點只能操做一次)操做(就是交換第i和第i+1 兩個數的位置),問通過這麼屢次的操做,輸出可能的最小字典序字符串

思路:倒着從後往前,將最小的數儘量的往前交換,並且每一個位置交換一次,循環交換,之到不能夠交換位置爲止get

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <cmath>
 6 #include <algorithm>
 7 
 8 using namespace std;
 9 typedef long long ll;
10 int main()
11 {
12     int q;
13     cin >> q;
14     while(q--)
15     {
16         int n;
17         int a[110],b[110];
18         cin >> n;
19         for(int i=1;i<=n;i++)
20         {
21             scanf("%d",&a[i]);
22             b[i]=0;
23         }
24         int d =n-1;
25         while(d)
26         {
27             int flag =0;
28             for(int i=n;i>1;i--)
29             {
30                 if(a[i]<a[i-1]&&b[i-1]==0)
31                 {
32                     int t=a[i-1];
33                     a[i-1]=a[i];
34                     a[i]=t;
35                     d--;
36                     b[i-1]=1;
37                     flag=1;
38                     if(d==0)break;
39                 }
40             }
41             if(!flag||!d)break;
42         }
43         for(int i=1;i<n;i++)
44         {
45             printf("%d ",a[i]);
46         }
47         printf("%d\n",a[n]);
48     }
49     return 0;
50 }
思惟+亂搞

C題(第一波沒有寫出)string

題意:有m個木板,有一個n個寬度的河,每次能夠跳d距離,問可不能夠跳過去,跳的過去的話,就把每一個木板的位置表現出來

思路:貪心處理每一個空隙(每次都是(跳的最大距離和剩餘水寬)的最小值),跳一次緊跟木板,最後若是水還有,就把全部水都輸出

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cmath>
 5 #include <string>
 6 #include <algorithm>
 7 #include <map>
 8 #include <vector>
 9 #include <queue>
10 
11 using namespace std;
12 typedef long long ll;
13 int a[1010];
14 int main()
15 {
16     int n,m,d;
17     cin >> n >> m >> d;
18     int sum=0;
19     for(int i=1;i<=m;i++)
20     {
21         cin >> a[i];
22         sum+=a[i];
23     }
24     int q = ceil((n-sum)*1.0/(m+1));
25     if((d<=q))
26     {
27         cout<<"NO"<<endl;
28         return 0;
29     }
30     else{
31         cout << "YES"<<endl;
32         int num =1;
33         for(int i= 1;i<=m;i++)
34         {
35             int j = min(d-1,n-sum);
36             for(int k=0;k<j;k++)
37                 cout<<0<<' ';
38             for(int k=0;k<a[i];k++)
39             {
40                 cout<<num<<' ';
41             }
42             num++;
43             sum+=j;
44         }
45     }
46     for(int i=0;i<n-sum;i++)cout<<0<<' ';
47     return 0;
48 }
簡單思路+貪心思想

D題

題意:給你一個字符串(只含有1,0),長度爲N,一個操做數d,輸出通過操做後的最小字典序

思路:判斷每一個零的位置,將他儘量往前移動

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <cmath>
 6 #include <algorithm>
 7 
 8 using namespace std;
 9 typedef long long ll;
10 int main()
11 {
12     int q;
13     cin >> q;
14     while(q--)
15     {
16         ll n,d;
17         cin >> n >> d;
18         string s;
19         cin >> s;
20         ll num=0,cun=0;
21         int end_i=0,end_j=0;
22         for(int i = 0 ;i<n;i++)
23         {
24             if(s[i]=='0')
25             {
26                 num +=(i-cun);
27                 s[i]='1';
28                 cun++;
29                 //cout << num<<endl;
30                 if(num>d)
31                 {
32                     //cout<<"sfew"<<endl;
33                     cun--;
34                     num-=i-cun;
35                     d=d-num;
36                     s[i]='1';
37                     end_i=i-d;
38                     s[i-d]='0';
39                     break;
40                 }
41             }
42         }
43        // cout <<cun<<"wfw"<<endl;
44         //if(cun)
45         //cout << cun<<endl;
46         for(int i=0;i<cun;i++)cout<<0;
47         for(int i=cun;i<n;i++)
48         {
49           cout<<s[i];
50         }
51         cout<<endl;
52     }
53     return 0;
54 }
簡單思路+亂搞

 

------------恢復內容結束------------

相關文章
相關標籤/搜索