Zut_round 6周赛通过题题解

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值