Codeforces Round #434 (Div. 2)【A、B、C、D】
Codeforces Round #434 (Div. 2)
codeforces 858A. k-rounding【水】
题意:已知n和k,求n的最小倍数x,要求x后缀至少有k个0。
题解:答案就是10^k和n的最小公倍数。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 typedef long long ll; 7 ll gcd(ll a, ll b) {return b?gcd(b,a%b):a;} 8 int main() { 9 ll n, k, s=1; 10 scanf("%lld %lld", &n, &k); 11 while(k--) s *= 10; 12 ll t = gcd(n, s); 13 printf("%lld\n", n / t * s); 14 return 0; 15 }
codeforces 858B. Which floor? 【暴力】
题意:已知每层楼的房间数量相同但不知道具体数目,从一楼往上依次给每个房间从小到大编号(从1号开始),现在给出m个房间的信息(房间号和所在楼层),求第n号房间所在楼层,若有多解则输出-1。
题解:暴力,维护每层楼的可能的最小、最大房间数。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main() { 6 int n, m, k, f; 7 int mi=1, ma=100; 8 scanf("%d%d", &n, &m); 9 while(m--) { 10 scanf("%d%d", &k, &f); 11 if(f>1) ma = min(ma, (k-1)/(f-1)); 12 mi = max(mi, (k+f-1)/f); 13 } 14 //printf("%d %d\n", mi, ma); 15 if((f=(n+mi-1)/mi) != (n+ma-1)/ma) puts("-1"); 16 else printf("%d\n", f); 17 return 0; 18 }
codeforces 858C. Did you mean...【水】
题意:给你一个字符串,现在要你给其中加空格隔开单词,使得每个单词不能有连续三个以上不同的辅音字母,输出加的空格最少的字符串。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<map> 5 using namespace std; 6 const int N = 3001; 7 char s[N], t[N]; 8 map<char, int> mp; 9 int main() { 10 mp['a'] = mp['e'] = mp['i'] = mp['o'] = mp['u'] = 1; 11 int i, len; 12 gets(s); 13 len = strlen(s); 14 if(len < 3) {puts(s); return 0;} 15 int cnt = 0; 16 t[cnt++] = s[0]; t[cnt++] = s[1]; 17 for(i = 2; i < len; ++i) { 18 if(!mp[s[i]] && !mp[s[i-1]] && !mp[s[i-2]] && 19 (s[i]!=s[i-1] || s[i-1] != s[i-2])) { 20 t[cnt++] = ' '; t[cnt++] = s[i]; 21 s[i-1] = s[i-2] = 'a'; 22 } 23 else t[cnt++] = s[i]; 24 } 25 t[cnt++] = '\0'; 26 puts(t); 27 return 0; 28 }
待补。。
codeforces 858D. Polycarp's phone book【字典树】
题意:有n个不同的九位数的电话号码(非0开头),求每个电话号的最短的能唯一索引该号码的子串。(输入保证所有号码不同)
题解:将每个字符串的所有后缀插入字典树中,对每个号码的查询就先把其所有后缀删除,然后对其所有后缀查找其前缀出现的次数为0的最短号码即为答案。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 70010; 6 const int M = 10; 7 const int len = 9; 8 char a[N][M]; 9 struct Trie { 10 int next[M]; 11 int cnt; 12 void init() { 13 cnt = 0; 14 memset(next, -1, sizeof(next)); 15 } 16 }T[3150005]; 17 int le; 18 void inser(char *s) { 19 int i = 0, p = 0; 20 while(s[i]) { 21 int id = s[i] - '0'; 22 if(T[p].next[id] == -1) { 23 T[le].init(); 24 T[p].next[id] = le++; 25 } 26 p = T[p].next[id]; 27 T[p].cnt++; 28 i++; 29 } 30 } 31 void add(char *s) { 32 int i = 0, p = 0; 33 while(s[i]) { 34 int id = s[i] - '0'; 35 p = T[p].next[id]; 36 T[p].cnt++; 37 i++; 38 } 39 } 40 void del(char *s) { 41 int i = 0, p = 0; 42 while(s[i]) { 43 int id = s[i] - '0'; 44 p = T[p].next[id]; 45 T[p].cnt--; 46 i++; 47 } 48 } 49 int query(char *s) { 50 int i = 0, p = 0; 51 while(s[i]) { 52 int id = s[i] - '0'; 53 p = T[p].next[id]; 54 if(T[p].cnt == 0) return i; 55 i++; 56 } 57 return 11; 58 } 59 int main() { 60 int n, m, i, j, mi, t, l, r; 61 scanf("%d", &n); 62 le = 1; 63 T[0].init(); 64 for(i = 1; i<= n; ++i) { 65 scanf("%s", a[i]); 66 for(j = 0; j < len; ++j) inser(a[i]+j); 67 } 68 for(i = 1; i<= n; ++i) { 69 mi = 11; 70 for(j = 0; j < len; ++j) del(a[i]+j); 71 for(j = 0; j < len; ++j) { 72 t = query(a[i]+j); 73 if(t < mi) {mi = t; l = j; r = j+t;} 74 } 75 for(j = 0; j < len; ++j) add(a[i]+j); 76 for(j = l; j <= r; ++j) printf("%c", a[i][j]); 77 puts(""); 78 } 79 return 0; 80 }