zoukankan      html  css  js  c++  java
  • 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 */
  • 相关阅读:
    VPS CenteOS Linux 上传 下载文件(Apache配置、SSH)
    tar命令加密压缩
    操作系统命令技巧备忘录
    网络流量分析-PCAP切割、筛选、合并
    【Shell】30分钟关闭Tcpdump,开启Tcpdump、检测目录大小终止任务
    大数据做安全的网站
    WinRAR代码执行漏洞CVE-2018-20250
    Linux嗅探ettercap
    WindowsPE权威指南-PE文件头中的重定位表
    推荐书籍-恶意软件分析诀窍与工具箱
  • 原文地址:https://www.cnblogs.com/pengge666/p/15407066.html
Copyright © 2011-2022 走看看