西科大 算法分析1 完整代码.docx
《西科大 算法分析1 完整代码.docx》由会员分享,可在线阅读,更多相关《西科大 算法分析1 完整代码.docx(23页珍藏版)》请在冰豆网上搜索。
![西科大 算法分析1 完整代码.docx](https://file1.bdocx.com/fileroot1/2023-2/21/d4686d32-dfa0-4b11-b614-da111d6db5df/d4686d32-dfa0-4b11-b614-da111d6db5df1.gif)
西科大算法分析1完整代码
数字模式的识别
#include
#include
intb[4000001];
intmain(){
intmax,max_i;
intn,t,i;
while(scanf("%d",&n)==1){
memset(b,0,4000001);
while(n--!
=0){
scanf("%d",&t);
++b[t+2000000];
}
max=b[0];max_i=0;
for(i=1;i<=4000000;++i){
if(b[i]>max){
max=b[i];max_i=i;
}
}
printf("%d\n",max_i-2000000);
}
return0;
}
凸包面积
#include
#include
#include
#include
#definemax106
usingnamespacestd;
structpoint
{
intx,y;
};
pointspot[max],p0;
//p1p2距离
intdis(constpoint&p1,constpoint&p2)
{
return(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
}
//p1在p1p2左侧
boolcompares(constpoint&p1,constpoint&p2)
{
intt;
t=(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
if(t>0||(t==0&&dis(p1,p0)returntrue;
else
returnfalse;
}
doublearea(pointp1,pointp2,pointp3)//计算三角形面积;
{
doubles;
s=(p1.x*(p2.y-p3.y)+p2.x*(p3.y-p1.y)+p3.x*(p1.y-p2.y))/2.0;
returns;
}
intmain()
{
intn,i,x,y,p,m;
stacks;
cin>>m;
while(m--)
{
cin>>n;
for(i=0;icin>>spot[i].x>>spot[i].y;
x=spot[0].x;
y=spot[0].y;
p=0;
for(i=1;i{
if((spot[i].y==y&&spot[i].x{
x=spot[i].x;
y=spot[i].y;
p=i;
}
}
//x,y为最做点,即p0确定
p0.x=x;
p0.y=y;
swap(spot[0],spot[p]);
sort(spot+1,spot+n,compares);
//将0、1、2三个点压入堆栈S
s.push(p0);
s.push(spot[1]);
s.push(spot[2]);
pointtemp;
for(i=3;i{
while(!
s.empty())
{
temp=s.top();
s.pop();
p=(s.top().x)*temp.y+spot[i].x*(s.top().y)+temp.x*(spot[i].y)-spot[i].x*(temp.y)-temp.x*(s.top().y)-s.top().x*(spot[i].y);
if(p>0)//i位于spot[t-1]spot[t]左侧
{
s.push(temp);//将temp重新压入栈中
break;
}
}
s.push(spot[i]);//将i压入栈中
}
doublearea=0;
temp=s.top();
s.pop();
area+=(p0.x*temp.y-p0.y*temp.x)/2.0;
while(!
s.empty())
{
area+=(temp.x*s.top().y-temp.y*s.top().x)/2.0;
temp=s.top();
s.pop();
}
if(n<=2)
{
area=0;
}
if(area<0)
{
area=-area;
}
cout<:
fixed)<(1)<
}
return0;
}
翻煎饼
#include
usingnamespacestd;
ints[1000];
intmain()
{
inti,n,k=0;
cin>>n;
for(i=0l;icin>>s[i];
for(;n>1;n--)
{
intmax=0,l=0;
for(i=0;i{if(s[i]>max)
{
max=s[i];
l=i;
}
}
if(l==0)
{
k+=1;
for(i=0;i{
intt=s[i];
s[i]=s[n-1-i];
s[n-1-i]=t;
}
}
elseif(l{
k+=2;
for(i=0;i<(l+1)/2;i++)
{
intt=s[i];
s[i]=s[l-i];
s[l-i]=t;
}
for(i=0;i{
intt=s[i];
s[i]=s[n-1-i];
s[n-1-i]=t;
}
}
}
cout<}
变位词
#include
#include
#include
usingnamespacestd;
intmain()
{
chars1[1000],s2[1000];
intn,len1,len2;
cin>>n;
while(n--)
{
cin>>s1>>s2;
len1=strlen(s1);
len2=strlen(s2);
sort(s1,s1+len1);
sort(s2,s2+len2);
if(strcmp(s1,s2)==0)
cout<<"Yes"<else
cout<<"No"<}
}
Polynomialcalculate
#include
intmain()
{
inti,n,x,sum,num[22];
scanf("%d%d",&n,&x);
for(i=0;i{
scanf("%d",&num[i]);
}
if(0==n)
{
sum=0;
}
else
{
sum=num[n];
}
for(i=n-1;i>=0;i--)
{
sum=sum*x+num[i];
}
printf("%d\n",sum);
}
大整数乘法
#include
#include
voidmain()
{
inti,j,k,i1,m,i2,n,a[205]={0};
longb,c,d;
chars1[100],s2[100];
scanf("%d",&m);
scanf("%s",s1);
scanf("%s",s2);
d=0;
for(i1=0,k=m-1;i1{
for(i2=0,j=m-1;i2{
i=i1+i2;
b=a[i]+(s1[k]-48)*(s2[j]-48)+d;
a[i]=b%10;
d=b/10;
}
while(d>0)
{
i++;
a[i]=a[i]+d%10;
d=d/10;
}
n=i;
}
for(i=n;i>=0;i--)
printf("%d",a[i]);
printf("\n");
return0;
}
GoldNuggetsDistribution
#include
#include
#defineMAX50000000
#defineMIN-50000000
intmain()
{
inti;
intn;
intweight;
intmin=MAX;
intmax=MIN;
scanf("%d",&n);
for(i=0;i{
scanf("%d",&weight);
if(weight>max)
{
max=weight;
}
if(weight{
min=weight;
}
}
printf("%d%d\n",max,min);
return0;
}
TheDutchFlagProblem
#include
usingnamespacestd;
intmain()
{intn,coutr=0,coutb=0,coutw=0,i;
chara[500005];
cin>>n;
for(i=0;icin>>a[i];
for(i=0;i{
if(a[i]=='W')
coutw++;
elseif(a[i]=='R')
coutr++;
elseif(a[i]=='B')
coutb++;
}
for(i=0;icout<<"R";
for(i=0;icout<<"W";
for(i=0;icout<<"B";
cout<return0;
}
PostOffice
#include
#include
usingnamespacestd;
intf(inta)
{
returna<0?
-a:
a;
}
intmain()
{
inti,j,k,n;
cin>>n;
int*a=newint[n];
int*b=newint[n];
for(i=0;icin>>a[i]>>b[i];
sort(a,a+n);
sort(b,b+n);
j=a[n/2];
k=b[n/2];
intl=0;
for(i=0;il+=f(a[i]-j)+f(b[i]-k);
cout<}
TheJosephusProblem
#include
typedefunsignedintuint;
intmain()
{
uintn;
uintsum=1;
scanf("%d",&n);
while(sum<=n)
{
sum=sum*2;
}
n=n<<1;
sum=n∑
n=n&(~sum);
n=n|0x0001;
printf("%d\n",n);
return0;
}
Hornerscheme
#include
intmain()
{
inti,n,x,sum,num[22];
scanf("%d%d",&n,&x);
for(i=0;i{
scanf("%d",&num[i]);
}
if(0==n)
{
sum=0;
}
else
{
sum=num[n];
}
for(i=n-1;i>=0;i--)
{
sum=sum*x+num[i];
}
printf("%d\n",sum);
}
排列的字典序问题
#include
intmain()
{
inti,j,n,k,tmp,lens,labelNum=15,label,iCount2,sum=0,iCount=0,num[14];
scanf("%d",&n);
for(i=0;i{
scanf("%d",&num[i]);
}
for(i=0;i{
iCount=0;
for(j=i+1;j{
if(num[i]>num[j])
{
iCount++;
}
}
if(iCount!
=0)
{
k=n-i-1;
iCount2=1;
while(k>0)
{
iCount2*=k;
k--;
}
}
sum+=iCount*iCount2;
}
printf("%d\n",sum);
for(i=n-2;i>=0;i--)
{
if(num[i]{
break;
}
}
if(-1!
=i)//如果全是降序可能越界,即i=-1
{
for(k=i+1;k{
if(num[k]{
continue;
}
if(num[k]{
labelNum=num[k];
label=k;
}
}
tmp=num[i];
num[i]=num[label];
num[label]=tmp;
}
lens=n-1-i;
for(k=1;k<=lens/2;k++)
{
tmp=num[i+k];
num[i+k]=num[n-k];
num[n-k]=tmp;
}
for(i=0;i{
if(i!
=n-1)
{
printf("%d",num[i]);
}
else
{
printf("%d\n",num[i]);//最后输出也有空格
}
}
}
Binarysearch
#include
intbinSearch(intnum[],intn,intkey)
{
intlow=0,high=n-1,mid;
while(high>=low)
{
mid=(high+low)/2;
if(num[mid]==key)
{
returnmid;
}
elseif(num[mid]>key)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
return-1;
}
intmain()
{
inti,n,key,iCount,num[5000001];
scanf("%d%d",&n,&key);
for(i=0;i{
scanf("%d",&num[i]);
}
iCount=binSearch(num,n,key);
if(-1==iCount)
{
printf("-1\n");
}
else
{
printf("%d\n",iCount+1);
}
return0;
}
俄式乘法
#include
#include
intmain()
{
inta[100];
intn,m,i,sum=0,iCount=0;
scanf("%d%d",&n,&m);
while(1!
=n)
{
if(0==n%2)
{
n/=2;
}
else
{
n=(n-1)/2;
a[iCount++]=m;
sum+=a[iCount-1];
}
m*=2;
}
a[iCount++]=m;
sum+=m;
for(i=0;i{
if(i!
=iCount-1)
{
printf("%d+",a[i]);
}
else
{
printf("%d=%d\n",a[i],sum);
}
}
return0;
}
Pipeline
#include
#include
#include
usingnamespacestd;
intmain()
{
intsumDistance=0,oilMount,oilCount,oil[10001],i,j;
cin>>oilMount;
for(i=0;i{
cin>>j>>oil[i];
}
sort(oil,oil+oilMount);
oilCount=oilMount/2;
for(i=0;i{
sumDistance+=abs(oil[oilCount]-oil[i]);
}
cout<return0;
}
最近对问题
#include
#include
#defineINF10000000001
intmain()
{
intn,i,m,k,j,posX[1001],posY[1001];
doublemin=INF;
scanf("%d",&n);
for(i=0;i{
min=INF;
scanf("%d",&m);
for(k=0;k{
scanf("%d%d",&posX[k],&posY[k]);
}
for(k=0;k{
for(j=k+1;j{
if(min>(posX[j]-posX[k])
*(posX[j]-posX[k])
+(posY[j]-posY[k])
*(posY[j]-posY[k])
)
{
min=(posX[j]-posX[k])
*(posX[j]-posX[k])
+(posY[j]-posY[k])
*(posY[j]-posY[k])
;
}
}
}
printf("%.4f\n",sqrt(min));
}
return0;
}