BUPT 2014新生暑假个人排位赛05

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;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值