AIM Tech Round 4 (Div. 2) A B C
A. Diversity
题意:给出一个字符串,和n,问最多改变多少个字符,使其不同字符最少为n
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 6 map<char ,int >ma; 7 int main(){ 8 string s; 9 cin>>s; 10 int n; 11 cin>>n; 12 int sum=0; 13 for(int i=0;i<s.size();i++){ 14 if(!ma[s[i]]) sum++; 15 ma[s[i]]++; 16 } 17 18 if(sum>=n) { 19 printf("0\n"); 20 } 21 else { 22 int k=s.size(); 23 int x=min(26-sum,k-sum); 24 if(x>=n-sum){ 25 cout<<n-sum<<endl; 26 } 27 else cout<<"impossible"<<endl; 28 } 29 }
题意:给出一个0,1矩阵,问可以有多少个集合,使得里面的数字是同一行或者同一列,并且颜色相同
思路:计算每一行,每一列相同的数目,C(x,1)+C(x,2)+....C(x,x)=2^x-1;
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 int n,m; 6 int a[55][55]; 7 long long hh(long long a,long long b) 8 { 9 long long ans = 1; 10 while(b)//用一个循环从右到左便利b的所有二进制位 11 { 12 if(b&1)//判断此时b[i]的二进制位是否为1 13 { 14 ans = (ans*a);//乘到结果上,这里a是a^(2^i)%m 15 b--;//把该为变0 16 } 17 b/=2; 18 a = a*a; 19 } 20 return ans; 21 } 22 23 int main(){ 24 cin>>n>>m; 25 for(int i=1;i<=n;i++){ 26 for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); 27 } 28 ll sum=0; 29 int s1=0; 30 if(n==1&&m==1) { 31 cout<<1<<endl;return 0; 32 } 33 for(int i=1;i<=n;i++){ 34 s1=0; 35 for(int j=1;j<=m;j++){ 36 if(a[i][j]==1){ 37 s1++; 38 } 39 } 40 sum+=hh(2,s1)+hh(2,m-s1)-2; 41 } 42 for(int i=1;i<=m;i++){ 43 s1=0; 44 for(int j=1;j<=n;j++){ 45 if(a[j][i]==1) 46 s1++; 47 } 48 sum+=hh(2,s1)+hh(2,n-s1)-2; 49 } 50 cout<<sum-(n*m)<<endl; 51 }
题意:把一个数列分成若干子序列,然后给这个子序列排序,使其最后整个递增,每个标号出现一次
思路:和并查集思想类似,
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 5 int a[N],b[N]; 6 map<int ,int > ma; 7 int vis[N]; 8 int l=0; 9 set<int > s[N]; 10 11 void hh(int x){ 12 while(!vis[x]){ 13 vis[x]=1; 14 s[l].insert(x); 15 x=ma[b[x]]; 16 } 17 } 18 19 int main(){ 20 int n; 21 cin>>n; 22 for(int i=1;i<=n;i++) { 23 scanf("%d",&a[i]); 24 ma[a[i]]=i; 25 b[i]=a[i]; 26 } 27 sort(b+1,b+1+n); 28 for(int i=1;i<=n;i++){ 29 if(!vis[i]){ 30 l++;hh(i); 31 } 32 } 33 cout<<l<<endl; 34 for(int i=1;i<=l;i++){ 35 printf("%d",s[i].size()); 36 for(set<int >::iterator it=s[i].begin();it!=s[i].end();it++){ 37 printf(" %d",*it); 38 } 39 printf("\n"); 40 } 41 }