【Codeforces:从头开始】contest 1
1A
用 a × a 的石板覆盖 n × m 的长方形广场,允许石板覆盖的区域超出广场,不允许打破石板,石板的两侧应平行于广场两侧,要求覆盖完广场所需的石板数量最少是多少
样例图示:
(显然,答案为每边必须铺的+铺出去(1个或0个))
注意开 long long
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
int main(){
ld n,m,a;
cin >> n >> m >> a;
ll x=ceil(n/a),y=ceil(m/a);
cout << x*y << endl;
return 0;
}
1B
人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:
第一列被标为A,第二列为B,以此类推,第26列为Z。接下来为由两个字母构成的列号: 第27列为AA,第28列为AB...在标为ZZ的列之后则由三个字母构成列号,如此类推。
行号为从1开始的整数。
单元格的坐标由列号和行号连接而成。比如,BC23表示位于第55列23行的单元格。
有时也会采用被称为RXCY的坐标系统,其中X与Y为整数,坐标(X,Y)直接描述了对应单元格的位置。比如,R23C55即为前面所述的单元格。
您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式。
大模拟
我竟无话可说
好吧,一种相对简单的方法是把ABC坐标看作26进制数字
这样既可
但是我绝不是这种能用最简单方法解决问题的人
所以:暴力出奇迹!
把排名为1~1e6的所有字符串全部预处理出来
那么RC表变Excel表就解决了
Excel变RC只要小学数学即可
代码:
#include<bits/stdc++.h>
using namespace std;
int T;
bool flag;//flag=0:RC/flag=1:Excel
char s[1000005];
int n;
int x,y;
int p[15];
string C[1000005];
string qyj;
void init(){
for(int i=1;i<=26;i++){int cr=i+'A'-1;C[i]+=(char)cr;}
for(int i=27;i<=1000000;i++){
qyj=C[i-1];
bool IOI=0;
for(int j=qyj.size()-1;j>=0;j--){
if(qyj[j]!='Z'){IOI=1;qyj[j]++;break;}
qyj[j]='A';
}
if(!IOI) C[i]+='A';
C[i]+=qyj;
}
}
int main(){
init();
p[0]=1;
for(int i=1;i<=6;i++) p[i]=p[i-1]*26;
cin>>T;
while(T--){
scanf("%s",s+1);
n=strlen(s+1);
int cnt=0;
for(int i=1;i<n;i++){
if(s[i]>='A'&&s[i]<='Z'&&(s[i+1]<'A'||s[i+1]>'Z')) cnt++;
}
if(cnt==1) flag=1;
else flag=0;
if(flag==0){
x=0,y=0;
int u=0;
for(int i=1;i<=n;i++){
if(s[i]>='A'&&s[i]<='Z') u++;
if(s[i]>='0'&&s[i]<='9'){
if(u==1) x=(x*10)+(s[i]-'0');
else y=(y*10)+(s[i]-'0');
}
}
cout<<C[y];
printf("%d\n",x);
}
else{
bool u=0;
int x=0,y=0;
for(int i=1;i<=n;i++){
if(s[i]>='0'&&s[i]<='9') u=1;
if(u==0) y=(y*26)+(s[i]-'A'+1);
else x=(x*10)+(s[i]-'0');
}
printf("R%dC%d\n",x,y);
}
}
return 0;
}