北邮新生排位赛5解题报告

时间限制 1000 ms  内存限制 65536 KB

题目描述

给定集合A,求集合A的子集合B使得:B中元素的平方的平均值尽可能小。

输入格式

每组case两行,第一行一个正整数n,n<1e5,表示集合A的大小,第二行n个整数xi,xi<1e5,表示A中的元素。

输出格式

输出上述比值,如果是整数,直接输出,否则保留两位小数。

输入样例

3
4 5 6
4
2 4 5 6

输出样例

16
4

从A题卡住之后就基本不能思考了.....................没初始化这点没检查出来..

#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        long long minans=0x7fffffffffffffff;
        long long temp;
        while(n--){
        cin>>temp;
        minans=min(minans,temp*temp);
        }
        cout<<minans<<endl;
    }
    return 0;
}

B:立方体不一定是"平行于某轴的"....另:正立方体是正方形的空间图形,不是长方形的.......

现有的思考系统太懒了......主动性很低..基本上只能够"对于反应做出有限程度的应答",而且随着神经系统逐步失调这个情况会加重....好好锻炼身体.然后一年之后再回来总结总结吧

时间限制 1000 ms  内存限制 65536 KB

题目描述

已经知道一个正立方体的7个顶点的坐标,求最后顶点的坐标。

输入格式

第一行一个整数t,表示组数,t<1000。接下来每组数据有7行,每行三个整数,分别表示各点的x,y,z坐标,每个坐标的范围为[-1e6,1e6]。

输出格式

每组数据输出一行,所求顶点的坐标。

输入样例

2
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
0 3 0
4 0 0
7 4 0
3 7 0
4 0 5
7 4 5
0 3 5

输出样例

1 1 1
3 7 5

#include <iostream>
#include <assert.h>
using namespace std;
int x[7],y[7],z[7];
long long dis[12],diss[12],dise[12];
long long caldis(int x1,int x2,int y1,int y2,int z1,int z2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2);}
bool cmp(int tx,int ty,int tz){
    for(int i=0;i<7;i++){
        if(x[i]==tx&&y[i]==ty&&z[i]==tz)return true;
    }
    return false;
}
int ABS(int a){return a<0?-a:a;}
int main(){
    int t;cin>>t;
    while(t--){
        for(int i=0;i<7;i++)cin>>x[i]>>y[i]>>z[i];
        int len=0,maxs=-1,maxe=-1,maxdis=-1;
        for(int i=0;i<7;i++)if(i!=0){dis[len]=caldis(x[0],x[i],y[0],y[i],z[0],z[i]);diss[len]=0;dise[len++]=i;}
        for(int i=0;i<7;i++)if(i!=1){dis[len]=caldis(x[1],x[i],y[1],y[i],z[1],z[i]);diss[len]=1;dise[len++]=i;}
        for(int i=len-1;i>=0;i--){
            if(dis[i]>maxdis){
                maxs=diss[i];
                maxe=dise[i];
                maxdis=dis[i];
            }
        }
        int mx1=x[maxs],mx2=x[maxe],my1=y[maxs],my2=y[maxe],mz1=z[maxs],mz2=z[maxe];
        for(int i=0;i<7;i++){
            if(!cmp(mx1+mx2-x[i],my1+my2-y[i],mz1+mz2-z[i])){
                cout<<mx1+mx2-x[i]<<" "<<my1+my2-y[i]<<" "<<mz1+mz2-z[i]<<endl;
                break;
            }
        }
    }
    return 0;
}

C:

时间限制 1000 ms  内存限制 65536 KB

题目描述

给定一个字符串,求它的一个重排,使得没有两个相邻字符相同。

输入格式

第一行一个整数t,表示组数(t<10)。接下来的t行,每行一个字符串s,s中只包含小写字母,s的长度不大于1e5.

输出格式

若符合条件的重排存在,输出字典序最小的一个。
若不存在,输出-1。

输入样例

2
aabbccdd
aaaaabcd

输出样例

ababcdcd
-1
#include <cstdio>
#include <cstring>
using namespace std;
int num[26];
char sent[100005];
bool dfs(int numc,int index,int len){
//printf("numc:%d index:%d len:%d\n",numc,index,len);
    if(len==0)return true;
    for(int i=0;i<26;i++)if(num[i]*2>len+1)return false;else if(num[i]*2-len<=1&&num[i]*2>len){num[i]--;sent[index]=i+'a';sent[index+1]=0;return dfs(i,index+1,len-1);}
    for(int i=0;i<26;i++){
        if(i!=numc&&num[i]){
            num[i]--;
            sent[index]=i+'a';
            sent[index+1]=0;
            if(dfs(i,index+1,len-1))return true;
            num[i]++;
        }
    }
    return false;
}
int main(){
    int t;scanf("%d",&t);
    char ch=0;
    while(t--){
        memset(num,0,sizeof(num));
        int len=0;
        while((ch>'z'||ch<'a')&&ch!=EOF){ch=getchar();}
        while(ch<='z'&&ch>='a'){num[ch-'a']++;ch=getchar();len++;}
        if(!dfs(-1,0,len))printf("-1\n");
        else printf("%s\n",sent);
    }
    return 0;
}

D:

时间限制 1000 ms  内存限制 65536 KB

题目描述

已知函数f,f(0)=f(1)=1,对于所有n>=2,f(n)=f(n-1)+f(n-2)+n。给定n,求f(n)。

输入格式

第一行一个整数t,表示组数,t<1000。之后t行每行一个整数n,0<=n<=1e9。

输出格式

对于每组测试组,输出一行f(n)%1000000007.

输入样例

6
1
2
3
4
5
1000000000

输出样例

1
4
8
16
29
999999980

#include <cstdio>
#include <assert.h>
using namespace std;
int ret[4][4],add[4][4];
const int mod=1000000007;
const int orgret[4][4]={4,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0};
const int orgadd[4][4]={2,0,-1,1, 1,0,0,0, 0,1,0,0, 0,0,0,1};
long long amul(int a[4][4],int ai,int b[4][4],int bi){
    long long ans=0;
    for(int i=0;i<4;i++)ans+=((long long)a[ai][i]*(long long)b[i][bi]+mod)%mod;
    return (ans+mod)%mod;
}
void cop(int a[4][4],const int b[4][4]){for(int i=0;i<4;i++)for(int j=0;j<4;j++)a[i][j]=b[i][j];}
void multi(int a[4][4],int b[4][4],int rec[4][4]){
//for(int i=0;i<4;i++){for(int j=0;j<3;j++)printf("a[%d][%d]:%d ",i,j,a[i][j]);printf("a[%d][3]:%d\n",i,a[i][3]);}
//for(int i=0;i<4;i++){for(int j=0;j<3;j++)printf("b[%d][%d]:%d ",i,j,b[i][j]);printf("b[%d][3]:%d\n",i,b[i][3]);}
    long long temp[4][4];
    for(int i=0;i<4;i++)for(int j=0;j<4;j++)temp[i][j]=amul(a,i,b,j);
    for(int i=0;i<4;i++)for(int j=0;j<4;j++)rec[i][j]=temp[i][j];
//for(int i=0;i<4;i++){for(int j=0;j<3;j++)printf("rec[%d][%d]:%d ",i,j,rec[i][j]);printf("rec[%d][3]:%d\n",i,rec[i][3]);}printf("\n");
}


void qpow(int n){
    cop(ret,orgret);cop(add,orgadd);
    if(n<=0)return ;
    while(n!=0){
        if(n%2)multi(add,ret,ret);
        multi(add,add,add);
        n>>=1;
    }
}


int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        if(n==0||n==1)printf("1\n");
        else if(n==2)printf("4\n");
        else {
            qpow(n-2);
            printf("%d\n",ret[0][0]);
        }
    }
}

E: 

时间限制 1000 ms  内存限制 65536 KB

题目描述

    某学姐很喜欢打扑克,某次牌局中,机智的学姐已经通过某些不和谐的手段,得到了下家手上的牌型,可是学姐的机智值全都用来得到下家牌型了。她非常想知道自己是不是有一种出牌的方法,使得下家没有办法能大过自己,这个艰难的任务就交给你了。(不用判断输赢,只需判断这一轮牌有没有好的策略使下家没法大过自己)
    关于牌型比较
火箭:即双王(大王和小王),最大的牌。
炸弹:四张同数值牌(如四个7)。
单牌:单个牌(如一张5)。
对牌:数值相同的两张牌(如一对4)。
三张牌:数值相同的三张牌(如三个J)。
三带一:数值相同的三张牌 + 一张单牌或一对牌。例如:333+6 或 444+99。
四带二:四张牌+两手牌(注意:四带二不是炸弹)。
如: 5555+3+8 或 4444+55+77。

    关于牌型大小
火箭最大,可以打任意其他的牌。
炸弹比火箭小,比其他牌大。都是炸弹时按牌的分值比大小。
除火箭和炸弹外,其他牌必须要牌型相同且总张数相同才能比大小。相同牌型按牌的分值比大小。
依次是 大王 > 小王 >2>A>K>Q>J>10>9>8>7>6>5>4>3 ,不分花色。

输入格式

为了处理方便,我们用Y表示大王,X表示小王,T表示10。
所有牌都用A23456789TJQKXY表示,两家牌的数量小于20。
每组数据两行,有多组数据,EOF结束。

输出格式


每个测试数据一行Yes或者No

输入样例

4443
3334
AJJJ
3333

输出样例


Yes
No


#include <cstdio>
#include <cstring>
#include <assert.h>
#include<algorithm>
using namespace std;
char ant[21];
char self[21];
int sc[16],ac[16];
int sset[4],aset[4];
int addsset[4],addaset[4];
int card[256];
int inver(){
    memset(sc,0,sizeof(sc));memset(ac,0,sizeof(ac));
    memset(sset,0,sizeof(sset)); memset(aset,0,sizeof(aset));
    memset(addsset,0,sizeof(addsset)); memset(addaset,0,sizeof(addaset));
    for(int i=0;self[i]!=0;i++){
        int cnum=card[self[i]];
        int num=sc[cnum]>3?3:sc[cnum];
        sc[cnum]++;
        if(cnum>sset[num]){sset[num]=cnum;}
    }
        for(int i=0;ant[i]!=0;i++){
        int cnum=card[ant[i]];
        int num=ac[cnum]>3?3:ac[cnum];
        ac[cnum]++;
        if(cnum>aset[num]){aset[num]=cnum;}
    }
    for(int i=1;i<16;i++){
        if(sc[i]==2)addsset[1]=i;if(sc[i]==1)addsset[0]=i;
        if(ac[i]==2)addaset[1]=i;if(ac[i]==1)addaset[0]=i;
    }
    if(sc[15]&&sc[14])return 1;
    if(ac[15]&&ac[14])return -1;
    return 0;
}
int bomb(){
    if(aset[3]<=sset[3]&&sset[3])return 1;
    if(aset[3]!=0)return -1;
    return 0;
}
int three(){
    if(aset[2]<=sset[2]&&sset[2]!=0)return 1;
    if(sset[2]!=0&&addaset[1]==0&&addsset[1]!=0)return 1;
    if(sset[2]!=0&&addaset[0]==0&&addsset[0]!=0)return 1;
    return 0;
}
int two(){if(sset[1]>aset[1])return 1;return 0;}
int one(){if(sset[0]>aset[0])return 1;return 0;}
int main(){
card['3']=1;card['4']=2;card['5']=3;card['6']=4;
card['7']=5;card['8']=6;card['9']=7;card['T']=8;card['J']=9;
card['Q']=10;card['K']=11;card['A']=12;card['2']=13;card['X']=14;card['Y']=15;
    while(scanf("%s%s",self,ant)==2){
            int fl=0;
            for(int i=0;i<5;i++){
                switch(i){
                case 0:
                    fl=inver();
                    break;
                case 1:
                    fl=bomb();
                    break;
                case 2:
                    fl=three();
                    break;
                case 3:
                    fl=two();
                    break;
                case 4:
                    fl=one();
                    break;
                }
                if(fl==1){printf("Yes\n");break;}
                if(fl==-1){printf("No\n");break;}
            }
            if(fl==0){printf("No\n");}
    }
    return 0;
}

你可能感兴趣的:(北邮新生排位赛5解题报告)