Zut_round 6周赛通过题题解
1.A - LIS O(n^2) 模板 POJ - 2533
直接模板代入就可以了
#include <iostream>
using namespace std;
int dp[1005];
int a[1005];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
dp[i]=1;
}
for(int i=0;i<n;i++)
for(int j=0;j<i;j++)
if(a[j]<a[i])
dp[i]=max(dp[i],dp[j]+1);
int Max=0;
for(int i=0;i<n;i++)
if(Max<dp[i])
Max=dp[i];
cout<<Max<<endl;
return 0;
}
2.B - 一维线性dp ++ HDU - 2059
利用dp数组起始位置到每一加电站的最小时间,数组最后一个就是最短时间。每两个加电站之间的最短距离有两种情况:1.两点距离大于满电情况能通过距离2.两点距离小于满电情况能通过距离
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
int i,j,p[105],l,n,c,t,vr,v1,v2,len;
double dp[105],min,e;
while(scanf("%d",&l)==1)
{
scanf("%d%d%d%d%d%d",&n,&c,&t,&vr,&v1,&v2);
dp[0]=p[0]=0;
for(i=1;i<=n;i++)
scanf("%d",p+i);
p[i]=l;
for(i=1;i<n+2;i++)
{
min=0xffffff;
for(j=0;j<i;j++)
{
len=p[i]-p[j];
e=len>c?1.*c/v1+(len-c+0.)/v2:1.*len/v1;
e+=dp[j];
if(j)
e+=t;
if(min>e)
min=e;
}
dp[i]=min;
}
if(1.*l/vr>dp[n+1])
cout<<"What a pity rabbit!"<<endl;
else
cout<<"Good job,rabbit!"<<endl;
}
}
3.C - Frog Jumping CodeForces - 1077A
判断总的步数是奇数还是偶数,分情况加减就ok了。
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
long long a,b,c;
while(n--){
long long num=0;
cin>>a>>b>>c;
if(c%2==0)
{
num=(a-b)*c/2;
}
else
{
num=a*(c+1)/2-b*(c-1)/2;
}
cout<<num<<endl;
}
return 0;
}
4.D - Disturbed People CodeForces - 1077B
直接根据题意写出来就行了。左右是1,中间是0的情况下需要将右边的灯熄灭,统计一下出现次数就行了。
#include <iostream>
using namespace std;
int a[110];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int cnt=0;
for(int i=1;i<n-1;i++)
{
if(a[i-1]==1&&a[i+1]==1&&a[i]==0)
{
cnt++;
a[i+1]=0;
}
}
cout<<cnt<<endl;
return 0;
}
E - Good Array CodeForces - 1077C
创建两个数组,数组 a 记录输入的数,数组 b 记录数字出现的次数,再创建一个数组c用来存储符合要求的数字的下标,枚举每一个数字,用一个sum记录每个数字相加的和,用sum减去该数字的大小,如果a中出现了减去过后的一半,则满足条件
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
long long a[1000005],b[1000005],c[1000005];
long long sum,t;
int main()
{
int n;
while(cin>>n){
sum = 0;
memset(b,0,sizeof(b));
for(int i = 0;i < n;i++){
cin>>a[i];
sum += a[i];
b[a[i]]++;
}
int j=0;
int len=0;
for(int i = 0;i < n;i++){
t = sum-a[i];
if(t % 2 != 0||t>2000000)
continue;
t /= 2;
if(b[t] - (a[i] == t) > 0){
len++;
c[j]=i+1;
j++;
}
}
cout<<len<<endl;
for(int i = 0;i < len;i++){
if(i == 0)
cout<<c[i];
else
cout<<" "<<c[i];
}
cout<<endl;
}
return 0;
}