十月天梯赛训练补题 10.28

A - Dubious Cyrpto  CodeForces - 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 Vova CodeForces - 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?'
':' ');
81     }
82 }

D

E

F - Preparing Olympiad   CodeForces - 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 I  HDU - 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

原文地址:https://www.cnblogs.com/lihahahahaji/p/13897957.html