BOJ 442 平方的平均值
注意看题啊,用long long和绝对值是必须的啊!
另外,不要我证明为什么取一元子集就一定是对的!
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
//-----------------------------------------------------------------------
const int MAXN=100010;
int a[MAXN];
int main()
{
int n;
while(read(n))
{
long long minn=MAXN+10;
for(int i=0;i<n;i++)
{
long long temp;
scanf("%lld",&temp);
if(fabs(temp)<minn)
minn=fabs(temp);
}
printf("%lld\n",minn*minn);
}
return 0;
}
BOJ 431 立方体
根据空间向量来计算,设缺失的点关于体心的对称点为A,则A满足:到其他六个点的向量的长度三个三个相同,可以按照升序排序,则前三个相同,后三个相同。那么,缺失的点为A点加上前三个长度形同的向量。#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
#define EPS 1e-10
using namespace std;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
//-----------------------------------------------------------------------
typedef long long ll;
inline ll sqr(ll a)
{
return a*a;
}
int dcmp(double k)
{
if(k>=EPS||k<=-EPS)
return 1;
return 0;
}
struct Node
{
ll x,y,z;
Node(){};
Node(ll x,ll y,ll z):x(x),y(y),z(z){}
double length() const
{
return sqrt(sqr(x)+sqr(y)+sqr(z));
}
}a[10],c[120],ans;
Node operator - (const Node &a,const Node &b)
{
return Node(a.x-b.x,a.y-b.y,a.z-b.z);
}
Node operator + (const Node &a,const Node &b)
{
return Node(a.x+b.x,a.y+b.y,a.z+b.z);
}
double Dot(const Node &a,const Node &b)
{
return a.x*b.x+a.y*b.y+a.z*b.z;
}
bool cmp(Node a,Node b)
{
return a.length()<b.length();
}
int main()
{
int T;
read(T);
while(T--)
{
for(int i=0;i<7;i++)
read(a[i].x),read(a[i].y),read(a[i].z);
for(int i=0;i<7;i++)
{
int tot=0;
for(int j=0;j<7;j++)
{
if(i==j)
continue;
c[tot++]=a[j]-a[i];
}
sort(c,c+tot,cmp);
// for(int i=0;i<6;i++)
// cout<<" "<<c[i].length()<<":"<<c[i].x<<" "<<c[i].y<<" "<<c[i].z<<" "<<endl;
if(!dcmp(c[0].length()-c[1].length())&&!dcmp(c[0].length()-c[2].length())&&!dcmp(c[3].length()-c[4].length())&&!dcmp(c[3].length()-c[5].length()))
{
ans=a[i]+c[0]+c[1]+c[2];break;
}
}
printf("%lld %lld %lld\n",ans.x,ans.y,ans.z);
}
return 0;
}
/*
1
0 0 0
0 0 1000000
0 1000000 0
0 1000000 1000000
1000000 0 0
1000000 0 1000000
1000000 1000000 0
*/
BOJ 432 字符串重排
贪心,如果有字母的个数 num ,字符串长度 len,已填充的字符串个数 i 满足:2 * num - len + i == 1 的情况,则填充改字母;如果没有上述情况,则填充字典序最小的那个字母。以上所有点都满足不等于上一个的情况。
最后,其实这个应该放在最上面: 如果某个字母的个数 2 * num - len >=2,则不可能重排。
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
//-----------------------------------
char ch;
int ans[100010];
int main()
{
int T;
read(T);
while(T--)
{
int num[30]={0},len=0,maxx=-INF;
while((ch=getchar())!='\n')
num[ch-'a']++,len++;
for(int i=0;i<26;i++)
if(num[i]>maxx)
maxx=num[i];
if(2*maxx-len>1)
{
puts("-1");continue;
}
int last=-1;
for(int i=0;i<len;i++)
{
int po;
bool flag=false;
for(int j=0;j<26;j++)
if(j!=last&&num[j]*2-len+i==1)
{
po=j;flag=true;break;
}
for(int j=0;j<26&&!flag;j++)
if(num[j]&&j!=last)
{
po=j;break;
}
ans[i]=last=po;
num[po]--;
}
for(int i=0;i<len;i++)
putchar((char)ans[i]+'a');
putchar('\n');
}
return 0;
}
BOJ 433 Fibnacci
所有类似的递推式都可以通过前后的消元,将 n (或者某个数列 A n)这个消除,从而达到满足常系数的递推式。
题目的通项是
F[ n ] = Fibonacci + Lucas - n - 3,这个没什么用,你们看看就好.....
实际有用的而是
F [ n ] = 3 * F [ n-1 ] - 2 * F [ n-2 ] - F [ n-3 ] + F [ n-4 ];
然后大家就可以用矩阵快速幂轻松搞定。
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
#define EPS 1e-10
#define INF 0x3f3f3f3f
using namespace std;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
//-----------------------------------------------------------------------
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
const int M=1000000007;
mat mul(mat &A,mat &B)
{
mat c(A.size(),vec(B[0].size()));
for(int i=0;i<A.size();i++)
for(int k=0;k<B.size();k++)
for(int j=0;j<B[0].size();j++)
c[i][j]=(c[i][j]+((A[i][k]+M)%M)*((B[k][j]+M))%M)%M;
return c;
}
mat qpow(mat a,ll n)
{
mat b(a.size(),vec(a.size()));
for(int i=0;i<a.size();i++)
b[i][i]=1LL;
while(n>0)
{
if(n&1)
b=mul(b,a);
a=mul(a,a);
n>>=1;
}
return b;
}
void solve(ll n)
{
mat A(4,vec(4));
mat B(4,vec(1));
A[0][0]=3;A[0][1]=-2;A[0][2]=-1;A[0][3]=1;
A[1][0]=1;A[2][1]=1;A[3][2]=1;
B[0][0]=8;B[1][0]=4;B[2][0]=1;B[3][0]=1;
A = qpow(A,n);
B = mul(A,B);
printf("%lld\n",B[0][0]);
}
int main()
{
ll n,T;
read(T);
while(T--)
{
read(n);
if(n==0)
printf("1\n");
else if(n==1)
printf("1\n");
else if(n==2)
printf("4\n");
else if(n==3)
printf("8\n");
else
solve(n-3LL);
}
return 0;
}
BOJ 441 机智的学姐
纯模拟题,细心大胆持之以恒!#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
struct node
{
int sg[16];
int cp[14];
int tr[14][3]; //三不带 三带一 三带二
int ss[13][9]; //单顺 12张牌 最多8个起始点
int bs[11][11]; //双顺 最多10对 最多10个起始点
int ts[7][12][3]; //三顺 最多6组 最多11个起始点 不带 带单 带双
int bomb[14][3]; //炸 13种 不带就是炸 带单*2 带双*2
}A,B,T;
char a[50],b[50];
void Pre_Work(node &x,char y[])
{
int i,j,k,len=strlen(y);
memset(&x,0,sizeof(x));
//cout<<y<<endl;
for(i=0;i<len;i++) //处理单张牌
{
int t;
if(y[i]>='3'&&y[i]<='9')t=y[i]-'2';
else if(y[i]=='T')t=8;
else if(y[i]=='J')t=9;
else if(y[i]=='Q')t=10;
else if(y[i]=='K')t=11;
else if(y[i]=='A')t=12;
else if(y[i]=='2')t=13;
else if(y[i]=='X')t=14;
else if(y[i]=='Y')t=15;
x.sg[t]++;
if(x.sg[0]<t)x.sg[0]=t;
}
for(i=1;i<=13;i++) //处理对子 以及三不带 和炸弹
{
if(x.sg[i]>1)
{
x.cp[i]=1;
x.cp[0]=i;
}
if(x.sg[i]>2)
{
x.tr[i][0]=1;
x.tr[0][0]=i;
}
if(x.sg[i]>3)
{
x.bomb[i][0]=1;
x.bomb[0][0]=i;
}
}
for(i=1;i<=13;i++) //处理三带一 三带二
{
if(x.tr[i][0]==0)continue;
for(j=1;j<=15;j++)
{
if(j==i)continue;
if(x.sg[j])
{
x.tr[i][1]=1;
x.tr[0][1]=i;
break;
}
}
for(j=1;j<=13;j++)
{
if(j==i)continue;
if(x.cp[j])
{
x.tr[i][2]=1;
x.tr[0][2]=i;
break;
}
}
}
for(i=1;i<=13;i++) //处理四带二 四带两对
{
if(x.tr[i][0]==0)continue;
int cnt=0;
for(j=1;j<=15;j++)
{
if(j==i)continue;
if(x.sg[j])cnt+=x.sg[j];
if(cnt>=2)
{
x.bomb[i][1]=1;
x.bomb[0][1]=i;
break;
}
}
cnt=0;
for(j=1;j<=13;j++)
{
if(j==i)continue;
if(x.cp[j])cnt++;
if(cnt==2)
{
x.bomb[i][2]=1;
x.bomb[0][2]=i;
break;
}
}
}
for(i=1;i<=8;i++) //小五张
if(x.sg[i]&&x.sg[i+1]&&x.sg[i+2]&&x.sg[i+3]&&x.sg[i+4])
{
x.ss[5][i]=1;
x.ss[5][0]=i;
}
for(i=6;i<=12;i++) //大于五张
for(j=1;i+j-1<=12;j++)
if(x.ss[i-1][j]&&x.sg[i+j-1])
{
x.ss[i][j]=1;
x.ss[i][0]=j;
}
for(i=1;i<=10;i++) //三对
if(x.cp[i]&&x.cp[i+1]&&x.cp[i+2])
{
x.bs[3][i]=1;
x.bs[3][0]=i;
}
for(i=4;i<=12;i++) //大于三对
for(j=1;i+j-1<=12;j++)
if(x.bs[i-1][j]&&x.cp[i+j-1])
{
x.bs[i][j]=1;
x.bs[i][0]=j;
}
for(i=1;i<=11;i++) //两个三组
if(x.tr[i][0]&&x.tr[i+1][0])
{
x.ts[2][i][0]=1;
x.ts[2][0][0]=i;
}
for(i=3;i<=6;i++) //大于两个三组
for(j=1;i+j-1<=12;j++)
if(x.ts[i-1][j][0]&&x.tr[i+j-1][0])
{
x.ts[i][j][0]=1;
x.ts[i][0][0]=j;
}
//system("pause");
for(i=2;i<=6;i++) //飞机
{
for(j=1;i+j-1<=12;j++)
{
if(x.ts[i][j][0]==0)continue;
int cnt=0;
for(k=1;k<=15;j++)
{
if(k>=j&&k<=i+j-1)continue;
if(x.sg[j])cnt+=x.sg[j];
if(cnt>=i)
{
x.ts[i][j][1]=1;
x.ts[i][0][1]=j;
break;
}
}
cnt=0;
for(k=1;k<=13;k++)
{
if(k>=j&&k<=i+j-1)continue;
if(x.cp[j])cnt++;
if(cnt==i)
{
x.ts[i][j][2]=1;
x.ts[i][0][2]=j;
break;
}
}
}
}
}
void Solve()
{
while(scanf("%s%s",a,b)!=EOF)
{
A=T;
B=T;
Pre_Work(A,a);
//cout<<"Awan\n";
Pre_Work(B,b);
//cout<<"Bwan\n";
if(A.sg[14]&&A.sg[15])
{
printf("Yes\n");
//cout<<1<<endl;
continue;
}
else if(B.sg[14]&&B.sg[15])
{
printf("No\n");
//cout<<2<<endl;
continue;
}
if(A.bomb[0][0]>=B.bomb[0][0]&&A.bomb[0][0]>0)
{
printf("Yes\n");
//cout<<3<<endl;
continue;
}
if(A.bomb[0][0]<B.bomb[0][0])
{
printf("No\n");
//cout<<4<<endl;
continue;
}
if((A.sg[0]>=B.sg[0]&&A.sg[0])||(A.cp[0]>=B.cp[0]&&A.cp[0])||(A.tr[0][0]>=B.tr[0][0]&&A.tr[0][0])||(A.tr[0][1]>=B.tr[0][1]&&A.tr[0][1])||(A.tr[0][2]>=B.tr[0][2]&&A.tr[0][2]))
{
printf("Yes\n");
//cout<<5<<endl;
continue;
}
int flag=0;
for(int i=5;i<=12;i++)
if(A.ss[i][0]>=B.ss[i][0]&&A.ss[i][0])
{
flag=1;
break;
}
for(int i=3;i<=10;i++)
if(A.bs[i][0]>=B.bs[i][0]&&A.bs[i][0])
{
flag=1;
break;
}
for(int i=2;i<=6;i++)
if((A.ts[i][0][0]>=B.ts[i][0][0]&&A.ts[i][0][0])||(A.ts[i][0][1]>=B.ts[i][0][1]&&A.ts[i][0][1])||(A.ts[i][0][2]>=B.ts[i][0][2]&&A.ts[i][0][2]))
{
flag=1;
break;
}
if(flag==1)
{
printf("Yes\n");
//cout<<6<<endl;
continue;
}
else
{
printf("No\n");
//cout<<7<<endl;
/*
cout<<A.bs[3][0]<<endl;
cout<<B.bs[3][0]<<endl;
cout<<A.bs[4][0]<<endl;
cout<<B.bs[4][0]<<endl;
cout<<A.bs[5][0]<<endl;
cout<<B.bs[5][0]<<endl;*/
continue;
}
//cout<<B.bs[3][0]<<endl;
/*
A=B;
printf("sg_max=%d\n",A.sg[0]);
printf("cp_max=%d\n",A.cp[0]);
printf("tr[0]_max=%d\n",A.tr[0][0]);
printf("tr[1]_max=%d\n",A.tr[0][1]);
printf("tr[2]_max=%d\n",A.tr[0][2]);
for(int i=5;i<=12;i++)
printf("ss[%d]_max=%d\n",i,A.ss[i][0]);
for(int i=3;i<=10;i++)
printf("bs[%d]_max=%d\n",i,A.bs[i][0]);
for(int i=2;i<=6;i++)
{
printf("ts[%d][0]_max=%d\n",i,A.ts[i][0][0]);
printf("ts[%d][1]_max=%d\n",i,A.ts[i][0][1]);
printf("ts[%d][2]_max=%d\n",i,A.ts[i][0][2]);
}
printf("bomb[0]_max=%d\n",A.bomb[0][0]);
printf("bomb[1]_max=%d\n",A.bomb[0][1]);
printf("bomb[2]_max=%d\n",A.bomb[0][2]);
*/
}
}
int main()
{
Solve();
// system("pause");
return 0;
}