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 }

B - Rectangles

题意:给出一个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 }

C - Sorting by Subsequences

题意:把一个数列分成若干子序列,然后给这个子序列排序,使其最后整个递增,每个标号出现一次

思路:和并查集思想类似,

 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 }
时间: 2024-10-07 16:14:27

AIM Tech Round 4 (Div. 2) A B C的相关文章

AIM Tech Round 3 (Div. 2) B

Description Vasya takes part in the orienteering competition. There are n checkpoints located along the line at coordinates x1, x2, ..., xn. Vasya starts at the point with coordinate a. His goal is to visit at least n - 1 checkpoint in order to finis

AIM Tech Round 3 (Div. 2) E. Centroids

题解: 树形dp 非常好的一道题目 题意: 对于每个点.更改一条边,能否使得这个点成为树的重心 题解: 所谓重心:指去掉这个点后,最大的连通分量的点数<=n/2 对于每个点,分为向下分析,向上分析 向下分析:找寻点u的子节点的最大节点v.然后找寻节点v的子节点的小于等于n/2的最大子节点,连接到u上 向上分析:找寻点u的父节点的最大节点v.如果v==u那么.找寻次大节点w.然后找寻该点的子节点的小于等于n/2的最大子节点,连接到u上 向下分析和向上分析只需要判断一个,因为大于n/2的点只有一个

AIM Tech Round 4 (Div. 2)

A题 分析:暴力 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 const int maxn=100+10; 7 int vis[maxn],n; 8 string s; 9 int main() 10 { 11 cin>>s; 12 cin>

AIM Tech Round 3 (Div. 2)

5/5 这一场是比较水的一场(当然我是指div2),所以前面三题就略过吧... 题D D. Recover the String 题意:让你构造一个01串,给你00,01,10,11的子序列个数,问你有没有满足的串. 题解:这题实际上并不难, 只是分类讨论有点麻烦. 首先是00和11一定是满足n * (n - 1)  / 2,先判定一下 然后得到0的个数x,1的个数y 然后我们注意到,现一开始所有的0放在一起,然后插入一个位置k,那么我们发现01多了k,10多了x – k:假设这y个1 的位置是

AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)

A. Diversity time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output Calculate the minimum number of characters you need to change in the string s, so that it contains at least k different letters,

【AIM Tech Round 4 (Div. 2) D Prob】

·题目:D. Interactive LowerBound ·英文题,述大意:       有一个长度为n(n<=50000)的单链表,里面的元素是递增的.链表存储在一个数组里面,给出长度n.表头在数组的下标和一个值w.题目要求求出链表中大于等于w值的元素中的最小元素.注意,这道题是一道interactive.由于链表是未知的,最多可以进行1999个询问,询问形式:?i.表示询问数组下标为i,询问后,会得到一个答案组(val,Next),表示询问的元素是val,链表下一位所在的数组下标是Next

codeforces708b// Recover the String //AIM Tech Round 3 (Div. 1)

题意:有一个01组成的串,告知所有长度为2的子序列中,即00,01,10,11,的个数a,b,c,d.输出一种可能的串. 先求串中0,1的数目x,y. 首先,如果00的个数a不是0的话,设串中有x个0,C(X,2)=a,那么x*(x+1)=2a,解方程(其实只要看sqrt(x)*(sqrt(x)+1)等不等于2a),x没有整数解就IMPOSSIBLE.同理得出1的个数y.如果00个数是0看01个数. 第二,如果x*y!=b+c则IMPOSSIBLE,具体自己举个例子就明白. 最后,先将所有的0组

AIM Tech Round (Div. 2)

A. Save Luke 题意:给一个人的长度d,然后给一个区间长度0~L,给你两个子弹的速度v1,v2,两颗子弹从0和L向中间射去(其实不是子弹,是一种电影里面那种绞牙机之类的东西就是一个人被困在里面了,两边有着那种尖刺的墙向中间靠拢的那种)问Luke能存活的最长时间 思路:看代码吧,简单易懂 1 #include<cstdio> 2 #include<cmath> 3 int main() 4 { 5 int d,l,v1,v2; 6 while(scanf("%d%

【AIM Tech Round 5 (rated, Div. 1 + Div. 2) A】 Find Square

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找到左上角.往下一直走,往右一直走走到B边界就好. 中点的话.直接输出中位数 [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define all(x) x.begin(),