【Codeforces:从头开始】contest 1

【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值