【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; }
原文:https://www.cnblogs.com/QYJ060604/p/11418686.html