hihoCoder编程练习赛69
题目1 : 偶数长度回文子串
时间限制:5000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个小写字母字符串,请判断它是否有长度为偶数的非空连续回文子串
输入
输入包含多组数据。
每组数据包含一行一个小写字母字符串 S
1 ≤ |S| ≤ 105
输出
对于每组数据如果存在,输出YES,否则输出NO
- 样例输入
cabbad ababa
- 样例输出
YES NO
1 // 2018-07-29 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 7 using namespace std; 8 9 string str; 10 11 bool check(int p){ 12 if(str[p] == str[p+1])return true; 13 else return false; 14 } 15 16 int main() 17 { 18 while(cin>>str){ 19 int len = str.length(); 20 bool ok = false; 21 for(int ptr = 0; ptr < len-1; ptr++) 22 if(check(ptr)){ 23 cout<<"YES"<<endl; 24 ok = true; 25 break; 26 } 27 if(!ok)cout<<"NO"<<endl; 28 } 29 30 return 0; 31 }
题目2 : 特工配对
时间限制:20000ms
单点时限:1000ms
内存限制:256MB
描述
在 A 国有一个秘密特工组织,这个特工组织是由若干对双人组合构成的
现在特工组织有一批新人加入,为了防止背叛,组织规定来自相同城市的人不能配对在一起
现在已知 A 国有 n 个城市,且新人中来自第 i 个城市的有 ai 人,求最多组成几个配对
输入
第一行一个正整数 n
第二行 n 个数,第 i 个数是 ai
1 ≤ n ≤ 103
0 ≤ ai ≤ 109
输出
输出最多组成几个配对
- 样例输入
-
3 1 2 3
- 样例输出
-
3
1 // 2018-07-29 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 7 using namespace std; 8 9 int main() 10 { 11 int n, a; 12 cin>>n; 13 long long sum = 0; 14 int mx=0; 15 for(int i = 0; i < n; i++){ 16 cin>>a; 17 sum += a; 18 mx = max(mx, a); 19 } 20 if(mx > sum-mx)cout<<sum-mx<<endl; 21 else cout<<sum/2<<endl; 22 23 return 0; 24 }
题目3 : 阶乘问题
时间限制:20000ms
单点时限:1000ms
内存限制:256MB
描述
给定 n, k,求一个最大的整数 m,使得 km 是 n! 的约数
输入
第一行两个正整数 n, k
2 ≤ n,k ≤ 109
输出
输出最大的 m
- 样例输入
-
5 2
- 样例输出
-
3
1 // 2018-07-29 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #include <map> 7 #define ll long long 8 9 using namespace std; 10 11 const ll INF = 0x3f3f3f3f3f3f3f3f; 12 13 map<ll, ll> factor; 14 15 void get_fact(ll k){ 16 for(ll i = 2; i <= k; i++){ 17 if(k%i == 0){ 18 while(k%i==0){ 19 factor[i]++; 20 k/=i; 21 } 22 } 23 } 24 } 25 26 void print_factor(){ 27 for(auto &f: factor){ 28 cout<<f.first<<" "<<f.second<<endl; 29 } 30 } 31 32 int main() 33 { 34 ll n, k; 35 while(cin>>n>>k){ 36 factor.clear(); 37 if(k > n){ 38 cout<<0<<endl; 39 continue; 40 } 41 get_fact(k); 42 ll ans = INF; 43 for(auto &f: factor){ 44 ll a = f.first; 45 ll b = f.second; 46 ll sum = 0; 47 ll tmp = a; 48 while(tmp <= n){ 49 sum += n/tmp; 50 tmp *= a; 51 } 52 ans = min(ans, sum/b); 53 } 54 cout<<ans<<endl; 55 } 56 57 return 0; 58 }