百度

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 }  
View Code

 

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 }
my code 83%
 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 }
View Code

 

 

 

 

 

posted @ 2018-07-06 16:28  zz091207  阅读(331)  评论(0编辑  收藏  举报