给定集合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; }
现有的思考系统太懒了......主动性很低..基本上只能够"对于反应做出有限程度的应答",而且随着神经系统逐步失调这个情况会加重....好好锻炼身体.然后一年之后再回来总结总结吧
已经知道一个正立方体的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; }
给定一个字符串,求它的一个重排,使得没有两个相邻字符相同。
第一行一个整数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; }
已知函数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:
某学姐很喜欢打扑克,某次牌局中,机智的学姐已经通过某些不和谐的手段,得到了下家手上的牌型,可是学姐的机智值全都用来得到下家牌型了。她非常想知道自己是不是有一种出牌的方法,使得下家没有办法能大过自己,这个艰难的任务就交给你了。(不用判断输赢,只需判断这一轮牌有没有好的策略使下家没法大过自己)
关于牌型比较
火箭:即双王(大王和小王),最大的牌。
炸弹:四张同数值牌(如四个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; }