Codeforces 1

A. Theatre Square:

题目地址:http://codeforces.com/contest/1/problem/A

题目大意:n*m的长方形用a*a的正方形覆盖,允许超出长方形,问需要几个正方形。

算法讨论:计算长和宽分别需要几个a,相乘即可。

Code:

#include <cstdio>
#include <cmath>

using namespace std;

int n,m,a;

int main(){
	scanf("%d%d%d",&n,&m,&a);
	if (n%a==0) n/=a;else n=n/a+1;
	if (m%a==0) m/=a;else m=m/a+1;
	printf("%I64d\n",(long long)n*m);
	return 0;
}

B. Spreadsheets

题目地址:http://codeforces.com/contest/1/problem/B

题目大意:将1, 2, 3, ...按A, B, C, ..., AA, AB, ...标号,完成这2种标号的相互转换。

算法讨论:

首先先判断读入的某行是哪个询问,只需判断有几个字符和前一个字符的种类不同即可。

其次先是数字到字母的转化,将A..Z看作1..26,然后看作26进制,将读入的26进制数转化乘10进制即可。

然后是数字到字母的转化。设数字为x。对x作短除法的时候,若x%26==0,则对应的字母为‘Z’,x=x/26-1;否则1..25对应的字母为‘A‘..‘Y‘,x=x/26。

Code:

#include <cstdio>
#include <cstring>

#define N 10000

using namespace std;

int T,l,x,p,cnt,a[N+10];
char s[N+10];

bool type(char x){
	if (x>=‘0‘ && x<=‘9‘) return 0;
	else return 1;
}

int main(){
	scanf("%d",&T);
	for (int i=1;i<=T;++i){
		scanf("%s",s);
		l=strlen(s),cnt=0;
		for (int j=1;j<l;++j)
			if (type(s[j])!=type(s[j-1])) cnt++;
		if (cnt==1){
			x=p=0;
			for (int j=0;j<l;++j){
				if (type(s[j])!=type(s[j-1])){
					p=j;
					break;
				}
				x=x*26+s[j]-‘A‘+1;
			}
			printf("R");
			for (int j=p;j<l;++j) printf("%c",s[j]);
			printf("C%d\n",x);
		}
		else{
			x=p=0;
			for (int j=0;j<l;++j)
				if (s[j]==‘C‘){
					p=j;
					break;
				}
			for (int j=p+1;j<l;++j) x=x*10+s[j]-‘0‘;
			l=0;
			while (x)
				if (x%26) a[l++]=x%26,x/=26;
				else a[l++]=26,x=x/26-1;
			for (int j=l-1;j>=0;--j) printf("%c",a[j]+‘A‘-1);
			for (int j=1;j<p;++j) printf("%c",s[j]);
			printf("\n");
		}
	}
	return 0;
}

C. Ancient Berland Circus

题目大意:给出3个点,求最小面积的正多边形,使得这3个点为正多边形的顶点。

算法分析:

根据正多边形的性质,正多边形的每个顶点都在其外接圆上。

已知3个点,可以根据海伦公式求出三角形的面积S。然后根据正弦定理求出外接圆的半径R=abc/(4S),根据余弦定理求出三个圆心角。

求出三个圆心角的最大公约数A,则正多边形由2*pi/A个小三角形组成。

根据正弦定理求出每个小三角形的面积S0,则答案即为S0*2*pi/A。

Code:

#include <cstdio>
#include <cmath>

using namespace std;

const double pi=acos(-1),eps=1e-4;

double x[3],y[3],a,b,c,A,B,C,p,S,R,alpha,S0,n;

double fgcd(double a,double b){
	if (fabs(b)<eps) return a;
	return fgcd(b,fmod(a,b));
}

int main(){
	for (int i=0;i<3;++i) scanf("%lf%lf",&x[i],&y[i]);
	a=sqrt((x[0]-x[1])*(x[0]-x[1])+(y[0]-y[1])*(y[0]-y[1]));
	b=sqrt((x[0]-x[2])*(x[0]-x[2])+(y[0]-y[2])*(y[0]-y[2]));
	c=sqrt((x[1]-x[2])*(x[1]-x[2])+(y[1]-y[2])*(y[1]-y[2]));
	A=2*acos((b*b+c*c-a*a)/2/b/c);
	B=2*acos((a*a+c*c-b*b)/2/a/c);
	C=2*pi-A-B;
	p=(a+b+c)/2;
	S=sqrt(p*(p-a)*(p-b)*(p-c));
	R=a*b*c/4/S;
	alpha=fgcd(fgcd(A,B),C);
	n=2*pi/alpha;
	S0=R*R*sin(alpha)/2;
	printf("%0.7lf\n",n*S0);
	return 0;
}

By Charlie Pan

Apr 30,2014

时间: 2024-10-19 12:11:06

Codeforces 1的相关文章

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Codeforces Round #408 (Div. 2) B

Description Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, numbered from 1 to n, placed along the x-axis on a table that has m holes on it. More precisely, cup i is on the table at the position x?=?i. The probl

Codeforces 617 E. XOR and Favorite Number

题目链接:http://codeforces.com/problemset/problem/617/E 一看这种区间查询的题目,考虑一下莫队. 如何${O(1)}$的修改和查询呢? 令${f(i,j)}$表示区间${\left [ l,r \right ]}$内数字的异或和. 那么:${f(l,r)=f(1,r)~~xor~~f(1,l-1)=k}$ 记一下前缀异或和即可维护. 1 #include<iostream> 2 #include<cstdio> 3 #include&l

CodeForces - 601A The Two Routes

http://codeforces.com/problemset/problem/601/A 这道题没想过来, 有点脑筋急转弯的感觉了 本质上就是找最短路径 但是卡在不能重复走同一个点 ---->>> 这是来坑人的 因为这是一个完全图(不是被road 连接  就是被rail连接 ) 所以一定有一条直接连1 和 n的路径 那么只用找没有连 1 和 n 的路径的 那个图的最短路即可 然后这个dijkstra写的是O(V^2)的写法 以后尽量用优先队列的写法O(ElogV) 1 #includ

Codeforces Round #393 div2

A. Petr and a calendar(模拟) http://codeforces.com/problemset/problem/760/A 题意:已知2017年m月1日是星期d,求这个月日历有多少行. 算法:简单模拟或者直接用公式算. 代码: #include<bits/stdc++.h> using namespace std; int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int main() {