Codeforces Round #748 (Div. 3)【A-E】【D2:思维+因数分解】【E:拓扑排序】】

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define int long long
 6 
 7 const int N = 3e5+100 ;
 8 
 9 signed main(){
10     int T=1;
11     cin>>T;
12     while(T--){
13         int a,b,c;
14         cin>>a>>b>>c;
15         cout<<max(0ll,max(b,c)-a+1)<<" "<<max(0ll,max(a,c)-b+1)<<" "<<max(0ll,max(b,a)-c+1)<<endl;
16     }
17     return 0;
18 }

思路:依次枚举25的倍数结尾后两位
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define int long long
 6 
 7 const int N = 3e5+100 ;
 8 char str[N];
 9 signed main(){
10     int T=1;
11     cin>>T;
12     while(T--){
13         cin>>(str+1);
14         int len=strlen(str+1);
15         int ans=len;
16         //00
17         int s=0;
18         for(int i=len;i>=1;i--){
19             if(str[i]=='0'){
20                 s++;
21                 if(s>=2){
22                     ans=min(ans,len-i-1);
23                     break;
24                 }
25             }
26         }
27         
28         //25
29         int f=0;
30         for(int i=len;i>=1;i--){
31             if(str[i]=='5'){
32                 f=1;
33             }
34             if(f&&str[i]=='2'){
35                 ans=min(ans,len-i-1);
36                 break;
37             }
38         }
39         f=0;
40         for(int i=len;i>=1;i--){
41             if(str[i]=='5'){
42                 f=1;
43             }
44             if(f&&str[i]=='7'){
45                 ans=min(ans,len-i-1);
46                 break;
47             }
48         }
49         f=0;
50         for(int i=len;i>=1;i--){
51             if(str[i]=='0'){
52                 f=1;
53             }
54             if(f&&str[i]=='5'){
55                 ans=min(ans,len-i-1);
56                 break;
57             }
58         }
59         cout<<ans<<endl;
60     }
61     return 0;
62 }
63 /*
64 25
65 1550
66 75
67 00
68 */

思路:二分答案+贪心判断
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define int long long
 6 
 7 const int N = 5e5+100 ;
 8 //
 9 int n,k;
10 int arr[N];
11 int check(int num){
12     int pos=0;
13     int tmp=1;
14     for(int i=k-num+2;i<=1+k;i++){
15         pos+=(arr[i]-arr[i-1])*tmp;
16         tmp++; 
17         if(pos>=arr[i]){
18             return 0;
19         }
20     }
21     return 1;
22 }
23 signed main(){
24     int T=1;
25     cin>>T;
26     while(T--){
27         cin>>n>>k;
28         for(int i=1;i<=k;i++) cin>>arr[i];
29         arr[k+1]=n;
30         sort(arr+1,arr+2+k);
31         int l=0,r=k;
32         int ans=0;
33         while(l<=r){
34             int mid=(l+r)/2;
35             if(check(mid)){
36                 ans=mid;
37                 l=mid+1;
38             }else{
39                 r=mid-1;
40             }
41         }
42         cout<<ans<<endl;
43     }
44     return 0;
45 }
46 /*
47 4 4 5 7 8 9
48 */

思路1:直接暴力枚举
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define int long long
 6 int n;
 7 set<int> s;
 8 signed main(){
 9     int T=1;
10     cin>>T;
11     while(T--){
12         cin>>n;
13         s.clear();
14         for(int i=1;i<=n;i++){
15             int x;
16             cin>>x;
17             s.insert(x); 
18         }
19         if(s.size()==1){
20             cout<<"-1"<<'
';
21             continue;
22         }
23         int ans=1;
24         for(int i=2;i<=2e6;i++){
25             int tmp=-1;
26             int f=1;
27             for(auto j:s){
28                 if(j>=0){
29                     if(tmp==-1)
30                         tmp=(j%i);
31                     if((j%i)!=tmp){
32                         f=0;
33                         break;
34                     }
35                 }else{
36                     int num=(abs(j)/i);
37                     if(abs(j)%i) num++;
38                     if(tmp==-1)
39                         tmp=((j+num*i)%i);
40                     if(((j+num*i)%i)!=tmp){
41                         f=0;
42                         break;
43                     }
44                 }
45             }
46             if(f){
47                 ans=max(ans,i);
48             }
49         }
50         cout<<ans<<endl;
51     }
52     return 0;
53 }
思路2:求数值之间差的GCD
通过题意可知a[1] - a*k = a[2] - b*k  =  a[3] - c*k
移项就可以看出
 
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define int long long
 6 
 7 const int N = 5e5+100 ;
 8 //
 9 int n,k;
10 int arr[N];
11 vector<int> v;
12 signed main(){
13     int T=1;
14     cin>>T;
15     while(T--){
16         cin>>n;
17         v.clear();
18         for(int i=1;i<=n;i++) cin>>arr[i];
19         int t=arr[1],f=1;
20         for(int i=1;i<=n;i++){
21             if(arr[i]!=t){
22                 f=0;
23                 break;
24             } 
25         }
26         if(f){
27             cout<<"-1"<<endl;
28             continue;
29         }
30         for(int i=1;i<=n;i++){
31             for(int j=i+1;j<=n;j++){
32                 v.push_back(abs(arr[i]-arr[j]));
33             }
34         }
35         int ans=v[0];
36         for(int i=0;i<v.size();i++) ans=__gcd(ans,v[i]);
37         cout<<ans<<endl;
38     }
39     return 0;
40 }
41 /*
42 4 4 5 7 8 9
43 */

思路:枚举每个数,求出每个数与其他数的差值。接着因式分解,判断是否符合即可
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define pb push_back
 5 #define int long long
 6 const int  N = 2666666;
 7 int n;
 8 int arr[N];
 9 map<int,int> mp,vis;
10 
11 signed main(){
12 
13     int T=1;
14     cin>>T;
15     while(T--){
16         cin>>n;
17         mp.clear();
18         int F=0;
19         for(int i=0;i<n;i++){
20             cin>>arr[i];
21 //            cout<<arr[i]<<" "; 
22             mp[arr[i]]++;
23             if(mp[arr[i]]>=(n/2)){
24                 F=1;
25             }
26         }
27 //        cout<<"fuck"<<'
';
28         if(F){
29             cout<<"-1"<<endl;
30             continue;
31         }
32         int ans=1;
33         mp.clear();vis.clear();
34         for(int i=0;i<n;i++){
35             mp.clear();
36             int s=0;
37             for(int p=0;p<n;p++){
38                 if(i!=p&&arr[i]==arr[p]){
39                     s++;
40                 }
41             }
42             for(int j=0;j<n;j++){
43                 if(i!=j){
44                     int num=abs(arr[i]-arr[j]);
45                     vis.clear();
46 //                    cout<<num<<" ";
47                     for(int k=1;k<=sqrt(num);k++){
48                         if(!vis[k]&&num%k==0){
49                             mp[k]++;
50                             vis[k]=1;
51                             if(mp[k]+1>=n/2-s){
52                                 ans=max(ans,k);
53                             } 
54                             if(!vis[num/k]&&num%(num/k)==0){
55                                 mp[num/k]++;
56                                 vis[num/k]=1;
57                                 if(mp[num/k]+1>=n/2-s){
58                                     ans=max(ans,num/k);
59                                 } 
60                             }
61                         }
62                     }
63                 }
64             }
65         }
66         cout<<ans<<endl;
67     }
68     return 0;
69 }
70 /*
71 
72 30
73 4
74 100 500 300 -100
75 
76 */

思路:拓扑
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define int long long
 6 
 7 const int N = 5e5+100 ;
 8 //
 9 int n,k;
10 int arr[N];
11 vector<int> g[N],v;
12 int d[N];
13 map<int,int> mp;
14 
15 signed main(){
16     int T=1;
17     cin>>T;
18     while(T--){
19         mp.clear();
20         v.clear();
21         cin>>n>>k;
22         if(n==1){
23             cout<<"0"<<endl;
24             continue;
25         }
26         for(int i=0;i<=n;i++){
27             g[i].clear();
28             d[i]=0;
29         }
30         int a,b;
31         int s=0;
32         for(int i=1;i<=n-1;i++){
33             cin>>a>>b;
34             if(!mp[a]) mp[a]=1,s++;
35             if(!mp[b]) mp[b]=1,s++;
36             g[a].push_back(b),g[b].push_back(a);
37             d[a]++,d[b]++;
38         }
39         
40         for(int i=1;i<=n;i++){
41             if(d[i]==1) 
42                 v.push_back(i);
43         }
44         int sum=0;
45         for(int i=0;i<k;i++){
46             if(v.size()<=0) break;
47             vector<int> tmp;
48             tmp.clear();
49             sum+=v.size();
50             for(int o=0;o<v.size();o++){
51                 for(int j=0;j<g[v[o]].size();j++){
52                     d[g[v[o]][j]]--;
53                     if(d[g[v[o]][j]]==1){
54                         tmp.push_back(g[v[o]][j]);
55                     }
56                 }                
57             }
58 
59             v=tmp;
60         }
61         
62         cout<<n-sum<<endl;
63     }
64     return 0;
65 }
66 /*
67 
68 */
原文地址:https://www.cnblogs.com/pengge666/p/15407066.html