Problem B. Maximal Difference (Junior)
题意:给你一个n,让你找出n位数中各个位数相加相等且差值最大的值。 比如n=2就是91和19,所以答案就是72
题解:直接一个个算出来或者找规律,n=2就是91和19,n=3就是910和109,n=4就是9910和1099。
代码:
#include<cstdio>
int n;
int main(){
scanf("%d",&n);
switch(n){
case 1: printf("0\n");break;
case 2: printf("72\n");break;
case 3: printf("801\n");break;
case 4: printf("8811\n");break;
case 5: printf("89001\n");break;
case 6: printf("898101\n");break;
case 7: printf("8990001\n");break;
case 8: printf("89981001\n");break;
case 9: printf("899900001\n");break;
case 10: printf("8999810001\n");break;
}
return 0;
}
Problem D. Triangle Construction (Junior)
题意:给你三角形的三边,若不能成为三角形则输出Impossible ,否则输出三个点的坐标(任意)。
题解:固定两个点在x轴上,然后求出一个角的角度,用三角形正余弦定理就能搞定了= =
代码:
#include<cstdio>
#include<cmath>
const double eps=1e-7;
struct node{
double x,y;
}e[3];
double a,b,c;
double s;
int main(){
scanf("%lf%lf%lf",&a,&b,&c);
if(a+b-c<=eps||a+c-b<=eps||b+c-a<=eps){
printf("Impossible\n");
return 0;
}
e[0].x=e[0].y=0;
e[1].x=a;
e[1].y=0;
double s=acos((b*b+a*a-c*c)/(double)(2*a*b));
printf("%lf %lf\n",e[0].x,e[0].y);
printf("%lf %lf\n",e[1].x,e[1].y);
printf("%lf %lf\n",a-b*cos(s),b*sin(s));
return 0;
}
Problem F. Beautiful Patterns (Junior)
题意:给你一个n*m的地板和k块已经知道颜色的单元地板,若是这个地板在所有的2*2的块中都有3个白地板和1个黑地板或3个黑地板和1个白地板,则这个n*m的地板则为beautiful,求有多少种方法能使得这个n*m的地板为beautiful
题解:由于n,m较小,因此我们先枚举第一行的所有情况,最多有1024种情况(要排除不行的,题目给你是白色的,你却用黑色填充这种情况)。然后对于下一行,我们假设第一块是白色或者黑色的可能,然后从第二块开始枚举,就可以得到精确的这一行各块的颜色了,我们用mp[i][j]记录方法到第i行第j种方法的方案数,最后我们会得到这么一个递推公式:mp[i][ss]=(mp[i][ss]+mp[i-1][j])%mod。最后ans=∑mp[n-1][0->2^(m-1)]
代码:
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
ll n,m,k,x,y,z,flag,ss;
ll mp[15][1111],mmp[15][15];
ll s[15][15],ans,sa[15];
struct node{
ll x,y,z;
}e[105];
int main(){
scanf("%lld%lld%lld",&n,&m,&k);
for(ll i=0;i<=10;i++)
for(ll j=0;j<=10;j++) s[i][j]=-1;
for(ll i=0;i<k;i++){
scanf("%lld%lld%