第一次打Codeforces,然而时差问题不允许, 掉了分, 下次换个号。
今天写写水题发题解。
原比赛链接http://codeforces.com/contest/861 看了可以强行提升英文阅读水平
ProblemA K-rounding
题目大意是有正整数 N (N<=1e9) ,K (0=<K<=8) ,找一个末尾有K个零的数 且是N的整数倍
超简单,答案是 lcm(N,10^K)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long n,k; long long gcd(long a,long b){ return a%b==0?b:gcd(b,a%b); } int main(){ cin>>n>>k; int p=1; while(k--)p*=10; long long ans=0; ans=n*p/gcd(n,p); cout<<ans; return 0; }
ProblemB Which floor ?
有一栋楼,每层的房间数相同,不知道每层有多少房间,已知房间的编号是按层次的顺序向上标的 (比如每层楼有三个房间,那么1,2,3号房间在第一层,4,5,6在第二层……)
下面给你M(M<=100)条信息,每条信息告诉你第ki个房间属于第fi层, 问题是求出第N(N<=100)个房间在第几层,如果判断不了就输出-1
这个可怜的数据范围, 就暴力枚举每层有多少房间,之后模拟,没了
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 int main(){ 5 int ans=-1,l=1,r=101; 6 int x=0,y=0; 7 scanf("%d%d",&n,&m); 8 for(int i=1;i<=m;i++){ 9 cin>>x>>y; 10 if(y==1)l=max(l,x); 11 else{ 12 l=max(l,x/y+(x%y==0?0:1)); 13 r=min(r,(x-1)/(y-1)); 14 } 15 } 16 for(int i=l;i<=r;i++) 17 { 18 int x=n/i+(n%i==0?0:1); 19 if(ans==-1)ans=x; 20 else if(ans!=x){cout<<-1;return 0;} 21 } 22 cout<<ans; 23 }
ProblemC Did you mean ?
把一个只含有小写字母的字符串分割成若干个合法的串,不合法串定义为 : 1.至少有连续的三个辅音字母(除了a e i o u)2.连续的辅音字母中至少有两个不同
简单的模拟,边读入边输出,累加连续的辅音字母个数,不合法就输出空格 。 注意一下赋的初值 ,还有过程中的小细节, 不然会被气死的
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[3005]; 4 int n; 5 int len; 6 bool flag; 7 int main(){ 8 scanf("%s",s+1); 9 n=strlen(s+1); 10 for(int i=1;i<=n;i++){ 11 if(s[i]!='a'&&s[i]!='e'&&s[i]!='i'&&s[i]!='o'&&s[i]!='u') 12 { 13 if(len&&s[i-1]!=s[i])flag=1; 14 if(flag&&len>=2) 15 { 16 printf(" "); 17 flag=0; 18 len=1; 19 } 20 else len++; 21 printf("%c",s[i]); 22 } 23 else 24 { 25 flag=0; 26 len=0; 27 printf("%c",s[i]); 28 } 29 } 30 return 0; 31 }
Problem D Polycarp's phone book
题意:有一个电话本(只有九个数字),输出每个字符串的一个子串,这个子串满足在其他串中没有出现过。
水题一个,字符串hash丢进map里。
#include<bits/stdc++.h> #include<map> #include<algorithm> using namespace std; typedef long long ll; map<ll,int> m; map<ll,int> S; int cnt; char s[70001][10]; int n,len[70001]; ll work(int i,int j,int k) { ll sum=0; for(j;j<=k;++j) sum=sum*11+s[i][j]-'0'+1; return sum; } int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%s",s[i]);len[i]=strlen(s[i]); for(int j=0;j<len[i];++j) for(int k=j;k<len[i];++k) ++m[work(i,j,k)]; } for(int i=1;i<=n;++i) { S.clear(); int ans=11,l=0; for(int j=0;j<len[i];++j) for(int k=j;k<len[i];++k) { int tmp=work(i,j,k); ++S[tmp]; if(S[tmp]==m[tmp]) {if(ans>k-j+1) {ans=k-j+1;l=j;}} } for(int j=l;j<=l+ans-1;++j) putchar(s[i][j]); putchar(' '); } }