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"<<'\n'; 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"<<'\n'; 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 */