百度
1. 乘法表
题目描述
度度熊和爷爷在玩一个乘法表游戏。乘法表的第i行第j列位置的元素为i*j,并且乘法表下标编号从1开始,比如2 × 3乘法表为
1 2 3
2 4 6
爷爷十分聪明,对于n*m的乘法表,只要度度熊给出一个数k,爷爷就能立刻告诉度度熊乘法表中元素按照不减顺序排列之后,第k个元素是多少。你能重复这个游戏吗?
输入
输入数据是三个整数:n, m, k (1≤n, m≤5*105, 1≤k≤nm)。
|
样例输入
2 3 4
|
输出
输出n*m乘法表按照不减顺序排列的第k个数。
|
样例输出
3
|
时间限制C/C++语言:1000MS其它语言:3000MS
|
内存限制C/C++语言:65536KB其它语言:589824KB
|
1 #include <iostream> 2 using namespace std; 3 typedef long long int64; // int64(LL): 64位整型数, 即long long的别称 4 5 int64 m,n,k; 6 int64 cal(int64 x) // 计算比x小的数的个数 7 { 8 int64 sum=0; 9 for(int i=1;i<=n;i++) 10 { 11 sum += (m <= x/i)?m:(x/i); // min(m,x/i) 是每一行中比x小的数的个数(若i*m<=x,则会有m个数满足要求,否则会有x/i个数满足),也可以用if,else的写法 或 ? : 表达式的写法. 12 } 13 return sum; 14 } 15 16 int64 binarySearch(int64 leftVal, int64 rightVal, int64 kth) 17 { 18 int64 midVal; 19 while(leftVal <= rightVal) 20 { 21 midVal=(leftVal+rightVal)/2; 22 if(cal(midVal) < kth) leftVal=midVal+1; // 要找的数在后面,区间下限继续增大 23 else rightVal=midVal-1; // 要找的数在前面,区间上限继续减小 24 } 25 return leftVal; 26 } 27 28 int main() 29 { 30 while(cin>>m>>n>>k && m>=1 && n>=1 && k>=1 && k<=m*n) 31 { 32 cout<<binarySearch(1,n*m,k); 33 cout<<endl; 34 } 35 return 0; 36 }
2. 编号转换
题目描述
小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的,规则类似。
表格单元所在的行则是按数值从1开始编号的,表格单元名称则是其列编号和行编号的组合,如单元格BB22代表的单元格为54列中第22行的单元格。
小B感兴趣的是,编号系统有时也可以采用RxCy的规则,其中x和y为数值,表示单元格位于第x行的有第y列。上述例子中的单元格采用这种编码体系时的名称为R22C54。
小B希望快速实现两种表示之间的转换,请你帮忙设计程序将一种方式表示的坐标转换为另一种方式。
输入
输入的第一行为一个正整数T,表示有T组测试数据(1<=T<=10^5)。随后的T行中,每行为一组测试数据,为一种形式表示的单元格坐标。保证所有的坐标都是正确的,且所有行列坐标值均不超过10^6。
|
样例输入
2 R23C55 BC23
|
输出
对每组测试数据,单独输出一行,为单元格坐标的另一种表示形式。
|
样例输出
BC23 R23C55
|
时间限制C/C++语言:1000MS其它语言:3000MS
|
内存限制C/C++语言:65536KB其它语言:589824KB
|
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 typedef long long ll; 6 7 int isRC(string &str) { 8 if (str[0] != 'R' || str[1] < '0' || str[1] > '9') 9 return -1; 10 int i = 2; 11 for (; i < str.size() && str[i] >= '0' && str[i] <= '9'; ++i); 12 if (i != str.size() && str[i] == 'C') 13 return i; 14 return -1; 15 } 16 17 string numToStr(ll num) { 18 string str; 19 while (num != 0) { 20 string tmp("A"); 21 tmp[0] = tmp[0] + char(num%26 - 1); 22 str = tmp + str; 23 num /= 26; 24 } 25 return str; 26 } 27 28 string strToInt(string str) { 29 ll ret = 0; 30 for (int i = 0; i < str.size(); ++i) { 31 ret = ret*26 + str[i] - 'A' + 1; 32 } 33 return to_string(ret); 34 } 35 36 int main() { 37 ll num; 38 cin >> num; 39 string str; 40 while (num--) { 41 cin >> str; 42 int Cindex = isRC(str); 43 if (Cindex > 0) { 44 // int row = stoi(str.substr(1, Cindex - 1)); 45 ll col = stoll(str.substr(Cindex + 1)); 46 cout << numToStr(col) + str.substr(1, Cindex - 1) << endl; 47 } 48 else { 49 int index = 1; 50 for (; str[index] <= 'Z' && str[index] >= 'A'; ++index); 51 cout << string("R") + str.substr(index) + "C" + strToInt(str.substr(0, index)) << endl; 52 } 53 } 54 }
1 // 还没看 2 #include <iostream> 3 #include <stdlib.h> 4 #include <vector> 5 #include <string> 6 #include <cctype> 7 using namespace std; 8 bool isrc(string &s) 9 { 10 if(s.size()<2) return false; 11 if(!(s[0]=='R'&&isdigit(s[1]))) return 0; 12 int i=1; 13 while(i<s.size()&&s[i]!='C') i++; 14 if(i==s.size()) return 0; 15 return 1; 16 } 17 string int2str(int num) 18 { 19 string s=""; 20 while(num) 21 { 22 int i=num%26; 23 if(i==0) 24 { 25 char c='Z'; 26 s=c+s; 27 num=num/26-1; 28 }else 29 { 30 char c='A'+num%26-1; 31 num/=26; 32 s=c+s; 33 } 34 } 35 return s; 36 } 37 string rc2(string &rc) 38 { 39 string ans=" "; 40 int i=1; 41 while(rc[i]!='C') i++; 42 int col=atoi(rc.substr(i+1).c_str()); 43 string s=int2str(col);s+=rc.substr(1,i-1); 44 45 return s; 46 } 47 string fun(int num) 48 { 49 string s=""; 50 while(num) 51 { 52 char c='0'+num%10; 53 s=c+s; 54 num/=10; 55 } 56 return s; 57 } 58 string i2rc(string &s) 59 { 60 int i=0;int col=0; 61 while(!isdigit(s[i])) { 62 col=col*26+(s[i]-'A'+1); i++; 63 } 64 string r="R"; 65 r+=s.substr(i); r+="C"; 66 r+=fun(col); 67 return r; 68 } 69 int main() 70 { 71 // string rc="R23C52",i="BC23"; 72 // cout<<rc2(rc)<<endl; 73 // cout<<i2rc(i); 74 int n;cin>>n; 75 for(int i=0;i<n;i++) 76 { 77 string rc,s; 78 cin>>rc; 79 if(isrc(rc)) s=rc2(rc); 80 else s=i2rc(rc); 81 cout<<s<<endl; 82 } 83 84 }