第一题:Free Cash
水题
想复杂了,排序、计数、数组都用上了
现贴上已经优化的代码
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int c[2000];
int main()
{
int n;
int h,m;
int i;
cin>>n;
for(i=0;i<n;i++)
{
cin>>h>>m;
c[h*60+m]++;
}
int max=0;
for(i=0;i<=1439;i++)
{
if(c[i]>max)
max=c[i];
}
cout<<max<<endl;
return 0;
}
第二题: Young Table
这题多少有些坑人,其实答案是多种的,正确理解 Note that you are allowed to perform any number of operations,but not more than s.
下面是两种方法
第一种:直接交换 找一个数右下最小的数,交换
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
int c[100];
int a[100][100];
int i,j;
cin>>n;
for(i=0;i<n;i++)
{
cin>>c[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<c[i];j++)
{
cin>>a[i][j];
}
}
int i1,j1;
int x[3000],y[3000];
int xx[3000],yy[3000];
int x1,y1,x2,y2;
int flag;
int ans,temp;
int step=0;
int k=0;
for(i=0;i<n;i++)
{
for(j=0;j<c[i];j++)
{
flag=0;
x1=i+1;y1=j+1;
ans=a[i][j];
for(i1=i;i1<n;i1++)
{
for(j1=j;j1<c[i1];j1++)
{
if(a[i1][j1]<ans)
{
flag=1;
ans=a[i1][j1];
x2=i1+1;y2=j1+1;
}
}
}
if(flag==1)
{
x[k]=x1;y[k]=y1;
xx[k]=x2;yy[k]=y2;
k++;
step+=1;
temp=a[x1-1][y1-1];
a[x1-1][y1-1]=a[x2-1][y2-1];
a[x2-1][y2-1]=temp;
}
}
}
cout<<step<<endl;
for(i=0;i<k;i++)
{
cout<<x[i]<<" "<<y[i]<<" "<<xx[i]<<" "<<yy[i]<<endl;
}
return 0;
}
第二种: 间接方法 先把二维变一维 最后排成类似这种
1 2 3
4 5
6
(从左到右,从上到下依次增大)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int main()
{
int n;
int c[100];
int a[100][100];
int b[3000];
int x[3000],y[3000];
int x1[3000],y1[3000];
int x2[3000],y2[3000];
int i,j,k=0;
cin>>n;
for(i=0;i<n;i++)
cin>>c[i];
for(i=0;i<n;i++){
for(j=0;j<c[i];j++){
cin>>a[i][j];
b[k]=a[i][j];
x[k]=i;
y[k]=j;
k++;
}
}
int ans,temp;
int x3,y3;
int k1=0;
int flag;
int step=0;
int j1;
for(i=0;i<k;i++)
{
flag=0;
ans=b[i];
for(j=i+1;j<k;j++)
{
if(b[j]<ans)
{
j1=j;
flag=1;
ans=b[j];
x3=x[j]+1;
y3=y[j]+1;
}
}
if(flag==1)
{
temp=b[i];
b[i]=b[j1];
b[j1]=temp;
step++;
x1[k1]=x[i]+1;
y1[k1]=y[i]+1;
x2[k1]=x3;
y2[k1]=y3;
k1++;
}
}
cout<<step<<endl;
for(i=0;i<k1;i++)
{
cout<<x1[i]<<" "<<y1[i]<<" "<<x2[i]<<" "<<y2[i]<<endl;
}
return 0;
}
第三题:Primes on Interval
对长度l进行二分运算
#include<iostream>
#include<cstdio>
using namespace std;
int p[1100000];
int count[1100000];
void Prime()
{
p[1]=1;
for(int i=2; i<1100000; i++)
{
for(int j=2*i; j<=1100000; j+=i)
p[j]=1;
}
}
int main()
{
Prime();
int i,j;
for(i=2;i<=1000000;i++)
{
if(p[i]==0)
count[i]=count[i-1]+1;
else
count[i]=count[i-1];
}
int flag;
int flag2=0;
int a,b,k;
cin>>a>>b>>k;
int xl=1;
int sl=b-a+1;
int ml;
while(sl>=xl)
{
flag=0;
ml=(sl+xl)/2;
for(i=a;i<=b-ml+1;i++)
{
if(count[i+ml-1]-count[i-1]<k)
{
flag=1;
break;
}
}
if(flag==1)
{
xl=ml+1;
}
else
{
flag2=1;
sl=ml-1;
}
}
if(flag2==1)
cout<<xl<<endl;
else
cout<<-1<<endl;
return 0;
}