Codeforces Round #603 (Div. 2) A,B,C,D【E题待补】

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 signed main(){
 5     int _;
 6     cin>>_;
 7     while(_--){
 8         int a[4];int add=0;
 9         for(int i=1;i<=3;i++){
10             cin>>a[i];add+=a[i];
11         }    
12         sort(a+1,a+1+3);
20         int sum1=0;
21         int cha=a[3]-a[2];
22         if(a[1]>=cha){
23             a[1]-=cha;
24             int ans=0;
25             ans=a[3]+a[1]/2;
26             cout<<ans<<'
';
27         }else{
28             cout<<min(a[1]+a[2],a[3])<<'
';
29         }
30     //cout<<sum<<'
';
31     } 
32     return 0;
33 } 

或者二分也行。

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4 #define int long long
 5 #define inf 0x3f3f3f3f3f
 6 signed main(){
 7     int _;int a,b,c;
 8     cin>>_;
 9     while(_--){
10         cin>>a>>b>>c;
11         int ans=0;
12         int l=0;
13         int r=300000090;
14         while(l<=r){
15             int mid=(l+r)/2;
16             int sum=0;
17             sum=min(a,mid)+min(b,mid)+min(c,mid);
18             if(sum>=2*mid){
19             l=mid+1;
20                 ans=max(ans,mid);
21             }else{
22                 r=mid-1;
23                 
24             }
25         }
26         cout<<ans<<'
';
27     } 
28     return 0;
29 }

 直接暴力就行。但是注意要先记录出现次数然后才能更改。要不然就没了QAQ

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4 #define int long long
 5 string str[1500];
 6 map<string,int> mp;
 7 bool cmp(string a,string b){
 8     return a>b;
 9 }    
10 signed main(){
11     int _;
12     cin>>_;
13     while(_--){
14         int n;
15         mp.clear();
16         cin>>n;
17         int flag=1;
18         int s=0;
19         
20         for(int i=0;i<n;i++){
21             cin>>str[i];
22             mp[str[i]]++;
23         
24     
25         }
26     //    sort(str,str+n,cmp);
27         
28         for(int i=0;i<n;i++){
29             
30             int F=0;
31             if(mp[str[i]]>=2){
32                 for(int j=str[i].size()-1;j>=0;j--){
33                     for(int k=0;k<=9;k++){
34                         string temp;
35                         temp=str[i];
36                         temp[j]=k+'0';
37                         if(!mp[temp]){
38                             mp[temp]++;
39                             s++;
40                             mp[str[i]]--;
41                             str[i]=temp;
42                             F=1;
43                         }
44                         if(F){
45                             break;
46                         }
47                     }
48                     if(F){
49                         break;
50                     }
51                 }
52             }
53         }
54         cout<<s<<'
';
55         for(int i=0;i<n;i++)
56             cout<<str[i]<<'
';
57     }
58     return 0;
59 }

一共有n块钱,k个人[n/k]块钱,向下取整。

现在给你n块钱,你不知道有多少人,输出每个人可能获得多少钱

其实就是找可行方案。【好像正规做法是数论分块】

题意没理解QAQ。

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4  
 5 #define int long long
 6  
 7 signed main(){
 8     int _;
 9     cin>>_;
10     while(_--){
11         int n;
12         cin>>n;
13         vector<int> ans;
14         map<int,int> mp;
15         ans.push_back(0);
16         for(int i=1;i*i<=n;i++){
17             if(!mp[i])
18                 ans.push_back(i);
19             mp[i]=1;
20             if(!mp[n/i])
21                 ans.push_back(n/i);
22             mp[n/i]=1;
23         }
24         sort(ans.begin(),ans.end());
25         cout<<ans.size()<<'
';
26         for(int i=0;i<ans.size();i++){
27             cout<<ans[i]<<" ";
28         }
29         cout<<'
';
30     }
31     return 0;
32 }

思路:暴力并查集就行了。真的难受。

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4 string str[1005000];
 5 int f[1005000];
 6 int n;
 7 map<int,int> mp;
 8 int getf(int v){
 9     if(f[v]==v){
10         return f[v];
11     }else{
12         f[v]=getf(f[v]);
13         return f[v];
14     }
15 }
16 void merge(int u,int v){
17     int t1=getf(u);
18     int t2=getf(v);
19     if(t1!=t2){
20         f[t2]=t1;
21     }
22 }
23 void init(){
24     for(int i=0;i<=n+1;i++)
25         f[i]=i;
26 }
27 signed main(){
28     cin>>n;
29     init();
30     int ans=0;
31     for(int i=1;i<=n;i++){
32         cin>>str[i];
33         for(int j=0;j<str[i].size();j++){
34             if(!mp[str[i][j]-'a']){
35                 mp[str[i][j]-'a']=i;
36             } 
37         } 
38     }
39     for(int i=1;i<=n;i++){
40         int F=1;
41         for(int j=0;j<str[i].size();j++){
42             if(i!=mp[str[i][j]-'a']&&F){
43                 merge(i,mp[str[i][j]-'a']);
44                 F=1;
45                 
46             }
47         }
48     }
49     for(int i=1;i<=n;i++){
50         if(f[i]==i)
51             ans++;
52     //    cout<<f[i]<<" ";
53     }
54 //    cout<<'
';
55     cout<<ans<<'
';
56     return 0;
57 }

 【菜是原罪】

原文地址:https://www.cnblogs.com/pengge666/p/11964013.html