hihocoder编程练习赛54

hihocoder编程练习赛54

A

描述

给定一个真分数P/Q(P < Q),请你求出它的小数部分都包括0~9中的哪些数字。
例如1/2=0.5,只包含数字5;1/3=0.33333……,只包含数字3,1/7=0.142857142857……,包含数字124578。

输入
两个整数P和Q,1 ≤ P < Q ≤ 1000000

输出
从小到大输出小数部分出现的所有数字

样例输入
13 123

样例输出
01569

参考AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<bits/stdc++.h>
using namespace std;
int p,q;
int vis[15];
int main(){
// freopen("input.txt","r",stdin);
while(cin>>p>>q){
int num=0;
memset(vis,0,sizeof vis);
while(1){
if(num==10000) break;
if(p<q) p*=10;
vis[p/q]=1;
p%=q;
if(p==0) break;
num++;
}
for(int i=0;i<=9;i++){
if(vis[i]) cout<<i;
}
cout<<endl;
}
return 0;
}

思路

模拟除的过程

B

描述
愚人节那天,小Ho在小Hi的一个回文字符串中添加了一个字符。你能帮助小Hi找到被添加的是第几个字符吗?

输入
一个只包含小写字母的字符串S。
对于70%的数据,|S| ≤ 1000
对于100%的数据,|S| ≤ 500000

输出
输出一个整数K,表示删除第K(从1开始计数)个字符后,S会变成一个回文字符串。
数据保证有解。如果有多个解,输出其中K最小的。

样例输入
aaba

样例输出
1

参考AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<bits/stdc++.h>
#define maxn 500050
using namespace std;
int l[maxn],len;
char s[maxn],tmp[maxn];
bool check(int x){
int cnt=0;
for(int i=1;i<=len;i++){
if(i==x) continue;
tmp[++cnt]=s[i];
}
for(int i=1;i<=cnt/2;i++){
if(tmp[i]!=tmp[cnt-i+1]) return false;
}
return true;
}
int main(){
scanf("%s",s+1);
len=strlen(s+1);
memset(l,0,sizeof l);
l[1]=1;
for(int i=2;i<=len;i++){
if(s[i]==s[i-1]) l[i]=l[i-1];
else l[i]=i;
}
int ans=0;
for(int i=1;i<=len/2;i++){
if(s[i]==s[len-i+1]) continue;
if(check(i)){
ans=i;
break;
}
if(check(len-i+1)){
ans=len-i+1;
break;
}
}
if(ans==0) ans=len/2+1;
cout<<l[ans]<<endl;
return 0;
}

思路

n方check
l存放每个连续数字出现的最左边位置
然后遍历i到len/2的位置 判断删除i和删除len-i+1是否能构成回文串
可以的话输出l[pos]
注意如果没有找到这样的pos 说明pos=len/2+1 也就是中间的位置

C

描述
给定N个数组,每个数组都包含M个整数。
现在你被要求从每个数组中选出一个数,总共N个数,然后求出其中最大与最小的差值。
在MN种选法中,差值最小是多少?

输入
第一行包含两个整数N和M。
以下N行,每行包含M个整数。
对于50%的数据,1 ≤ N × M ≤ 10000
对于100%的数据,1 ≤ N × M ≤ 200000 0 ≤ 每个整数 ≤ 1000000

输出
最小的差值

样例输入
3 3
8 1 6
3 5 7
4 9 2

样例输出
2

参考AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<bits/stdc++.h>
#define maxn 200050
#define inf 0x3f3f3f3f
#define pii pair<int,int>
using namespace std;
vector<pii>v;
int n,m;
int cnt[maxn];
int main(){
// freopen("input.txt","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int x;
cin>>x;
v.push_back(make_pair(x,i));
}
}
sort(v.begin(),v.end());
int num=0,ed=0;
int ans=inf;
for(int st=0;st<v.size();st++){
while(ed<v.size() && num<n){
cnt[v[ed].second]++;
if(cnt[v[ed].second]==1) num++;
ed++;
}
if(num==n) ans=min(ans,v[ed-1].first-v[st].first);
cnt[v[st].second]--;
if(cnt[v[st].second]==0) num--;
}
cout<<ans<<endl;
return 0;
}

思路

把n×m的数字放到一个vector里 排序后尺取
每次保证一个窗口里有n个不同行的数字

文章目录
  1. 1. hihocoder编程练习赛54
    1. 1.1. A
      1. 1.1.1. 参考AC代码
      2. 1.1.2. 思路
    2. 1.2. B
      1. 1.2.1. 参考AC代码
      2. 1.2.2. 思路
    3. 1.3. C
      1. 1.3.1. 参考AC代码
      2. 1.3.2. 思路
|