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 }
【菜是原罪】