1. 程式人生 > 實用技巧 >十月天梯賽訓練補題 10.28

十月天梯賽訓練補題 10.28

A - Dubious CyrptoCodeForces - 1379B

題意:在區間[l,r]中取a、b、c要求滿足a*n+(b-c)=m. m已知,n為正整數。

思路:模運算

 1 #include <set>
 2 #include <map>
 3 #include <list>
 4 #include <stack>
 5 #include <queue>
 6 #include <deque>
 7 #include <cmath>
 8 #include <string>
 9 #include <vector>
10
#include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <sstream> 14 #include <iostream> 15 #include <algorithm> 16 //#include <unordered_map> 17 #define INF 0x3f3f3f3f 18 #define ll long long 19 #define ull unsigned long long 20 #define FILL(a,n,v) fill(a,a+n,v) 21
#define Mset(a,v) memset(a,v,sizeof a) 22 #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b 23 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0) 24 using namespace std; 25 26 ll t; 27 ll l,r,m; 28 29 int main() 30 { 31 cin>>t; 32 while(t--) 33 { 34 cin>>l>>r>>m;
35 36 ll mx=r-l; 37 ll mi=l-r; 38 for(int i=l;i<=r;i++) 39 { 40 if(m%i<=mx&&m>=i) 41 { 42 cout<<i<<' '<<m%i+l<<' '<<l<<endl; 43 break; 44 } 45 if(m%i-i>=mi) 46 { 47 cout<<i<<' '<<r+m%i-i<<' '<<r<<endl; 48 break; 49 } 50 } 51 52 } 53 }

B

C - Big VovaCodeForces - 1407B

題意:給出序列a 將a重新排序成序列b 需滿足條件:

1.序列c: ci是

 1 #include <set>
 2 #include <map>
 3 #include <list>
 4 #include <stack>
 5 #include <queue>
 6 #include <deque>
 7 #include <cmath>
 8 #include <string>
 9 #include <vector>
10 #include <cstdio>
11 #include <cstring>
12 #include <cstdlib>
13 #include <sstream>
14 #include <iostream>
15 #include <algorithm>
16 //#include <unordered_map>
17 #define INF 0x3f3f3f3f
18 #define ll long long
19 #define ull unsigned long long
20 #define FILL(a,n,v) fill(a,a+n,v)
21 #define Mset(a,v) memset(a,v,sizeof a)
22 #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b
23 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
24 using namespace std;
25 
26 const int maxn=1e4;
27 int t;
28 int n;
29 int a[maxn];
30 int b[maxn];
31 int gcd(int a,int b)
32 {
33     return b==0?a:gcd(b,a%b);
34 }
35 
36 bool cmp(int a,int b)
37 {
38     return a>b;
39 }
40 
41 int main()
42 {
43     cin>>t;
44     while(t--)
45     {
46         cin>>n;
47         for(int i=0;i<n;i++) cin>>a[i];
48         sort(a,a+n,cmp);
49         
50 //        for(int i=0;i<n;i++) cout<<a[i]<<' ';
51         
52         bool vis[maxn];
53         memset(vis,false,sizeof vis);
54         
55         int max=a[0];
56         b[0]=a[0];
57         vis[0]=true;
58         for(int i=1;i<n;i++)
59         {
60             int tmp=0;
61             int tmpj=0;
62             for(int j=1;j<n;j++)
63             {
64                 if(!vis[j])
65                 {
66                     int t=gcd(max,a[j]);
67                     if(t>tmp)
68                     {
69                         
70                         tmp=t;
71                         tmpj=j;
72                     }
73                 }
74             }
75             vis[tmpj]=true;
76             b[i]=a[tmpj];
77             max=tmp;
78         }
79         
80         for(int i=0;i<n;i++) cout<<b[i]<<(i==n-1?'\n':' ');
81     }
82 }

D

E

F - Preparing OlympiadCodeForces - 550B

題意:在n個題目中選擇若干個,要求滿足:

1.題目的總難度在[l,r]之間。

2.最難題與最易題的難度差值>=x。

求滿足條件的方法數量。

思路:

暴力dfs。

 1 #include <set>
 2 #include <map>
 3 #include <list>
 4 #include <stack>
 5 #include <queue>
 6 #include <deque>
 7 #include <cmath>
 8 #include <string>
 9 #include <vector>
10 #include <cstdio>
11 #include <cstring>
12 #include <cstdlib>
13 #include <sstream>
14 #include <iostream>
15 #include <algorithm>
16 //#include <unordered_map>
17 #define INF 0x3f3f3f3f
18 #define ll long long
19 #define ull unsigned long long
20 #define FILL(a,n,v) fill(a,a+n,v)
21 #define Mset(a,v) memset(a,v,sizeof a)
22 #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b
23 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
24 using namespace std;
25 
26 int a[50];
27 int n,l,r,x;
28 
29 int cnt=0;
30 void dfs(int res,int first,int sub,int i)
31 {
32     if(i==n)
33     {
34         if(res>=l&&res<=r&&(sub>=x)) cnt++;
35         return;
36     }
37     
38     dfs(res,first,sub,i+1);
39     if(first==-1)
40     {
41         first=a[i];
42     }
43     dfs(res+a[i],first,a[i]-first,i+1);
44     
45 }
46 
47 int main()
48 {
49     cin>>n>>l>>r>>x;
50     for(int i=0;i<n;i++) cin>>a[i];
51     sort(a,a+n);
52     
53     dfs(0,-1,0,0);
54     cout<<cnt<<endl;
55 
56 }

G - Train Problem IHDU - 1022

題意:堆疊模擬

 1 #include <set>
 2 #include <map>
 3 #include <list>
 4 #include <stack>
 5 #include <queue>
 6 #include <deque>
 7 #include <cmath>
 8 #include <string>
 9 #include <vector>
10 #include <cstdio>
11 #include <cstring>
12 #include <cstdlib>
13 #include <sstream>
14 #include <iostream>
15 #include <algorithm>
16 //#include <unordered_map>
17 #define INF 0x3f3f3f3f
18 #define ll long long
19 #define ull unsigned long long
20 #define FILL(a,n,v) fill(a,a+n,v)
21 #define Mset(a,v) memset(a,v,sizeof a)
22 #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b
23 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
24 using namespace std;
25 int n;
26 
27 
28 int main()
29 {
30     while(cin>>n)
31     {
32         vector<string>v;
33         string s1;
34         string s2;
35         cin>>s1>>s2;
36         map<char,bool>vis;
37         stack<char>st;
38         int j=0;
39         bool flag=true;
40         for(int i=0;i<s2.size();i++)
41         {
42             
43             if(!vis[s2[i]])
44             {
45                 vis[s2[i]]=true;
46                 while(s1[j]!=s2[i]&&j<=s1.size())
47                 {
48                     vis[s1[j]]=true;
49                     st.push(s1[j++]);
50                     v.push_back("in");
51                 }
52                 v.push_back("in");
53                 j++;
54                 v.push_back("out");
55             }
56             else
57             {
58                 if(st.top()!=s2[i])
59                 {
60                     flag=false;
61                     cout<<"No."<<endl<<"FINISH"<<endl;
62                     break;
63                 }
64                 else
65                 {
66                     st.pop();
67                     v.push_back("out");
68                 }
69             }
70         }
71         
72         if(flag)
73         {
74             cout<<"Yes."<<endl;
75             for(int i=0;i<v.size();i++) cout<<v[i]<<endl;
76             cout<<"FINISH"<<endl;
77         }
78     }
79     
80 }

H

I