2021/2/8 CCF练习201812(c++)

201812-1

#include<iostream>
using namespace std;
#define MAX 1000
int a[MAX][2];
int main()
{
	int r,y,g,n;
	cin>>r>>y>>g;
	cin>>n;
	int sum=0;
	for(int i=0;i<n;i++)
	{
		    int k,t;
			cin>>k>>t;
			a[i][0]=k;
			a[i][1]=t;
			if(k==0||k==1)
				sum+=a[i][1];
			else if(k==2)
				sum=sum+t+r;
			else
				sum=sum;
	}
	cout<<sum<<endl;
	return 0;
}

201812-2
(20分错误代码)

#include<iostream>
using namespace std;
int r,y,g,n;
int k,t;
long long sum=0;
int judge(long long tt)
{
	if(tt>=0 && tt<r) return 1;	//红灯
	if(tt>=r+g && tt<r+g+y) return 2; //绿灯
	if(tt>=r && tt<r+g) return 3; //黄灯
}


int main()
{
	cin>>r>>y>>g;
	cin>>n;
	for(int i=0;i<n;i++)
	{
			cin>>k>>t;
			if(k==0)
				sum+=t;
			else if(k==1)
			{
				//刚开始这里是红灯,判断此时会变成什么灯
				long long tt=r-t;
				tt=(tt+sum)%(r+y+g);
				int flag=judge(tt);
				if(flag==1)
					sum+=r-tt;
				else if(flag==2)
					sum+=r+y+g-tt+r;
			}
			else if(k==2)
			{
				long long tt=r+g+y-t;
				tt==(tt+sum)%(r+y+g);
				int flag=judge(tt);
				if(flag==1)
					sum+=r-tt;
				else if(flag==2)
					sum+=r+y+g-tt+r;
			}
			else if(k==3)
			{
				long long tt=r+g-t;
				tt==(tt+sum)%(r+y+g);
				int flag=judge(tt);
				if(flag==1)
					sum+=r-tt;
				else if(flag==2)
					sum+=r+y+g-tt+r;
			}
			else 
				cout<<"ERROR"<<endl;
	}
	cout<<sum<<endl;
	return 0;
}

(100分代码)
不懂

法1:

#include <iostream>
using namespace std;

long long sum;
int main()
{
	int r,y,g,n;
	cin>>r>>y>>g;
	cin>>n;
	long long temp;
	for(int i=0;i<n;i++)
	{
		int k,t;
		cin>>k>>t;
		if(k==0){
			sum+=t;
			continue;
		}
		temp=sum%(r+y+g);
		while(temp>=t)
		{
			temp-=t;
			if(k==1)
			{
				t=g;
				k=3;
			}
			else if(k==2)
			{
				t=r;
				k=1;
			}
			else if(k==3)
			{
				t=y;
				k=2;
			}
		}
		t-=temp;
		if(k==1) sum+=t;
		if(k==2) sum=sum+t+r;
	}
	cout<<sum<<endl;
	return 0;
} 

法2:

#include <iostream>
using namespace std;
int main(){
   // freopen("1.txt","r",stdin);
    int A[3];
    //A[0]为红灯,A[1]为绿灯,A[2]为黄灯
    int n,k,t,total=0;
    scanf("%d%d%d%d",&A[0],&A[2],&A[1],&n);
    total=A[0]+A[1]+A[2];
    long long cnt=0;
    while(n--){
        scanf("%d%d",&k,&t);
        if(k==0) cnt+=t;
        else if(k==1||k==2){//红灯
            if(k==2) t+=A[0];
            if(cnt<=t) cnt+=(t-cnt);
            else{
                int left=(cnt-t)%total,i;
                for(i=1;left>=A[i];i=(i+1)%3)
                    left-=A[i];
                if(i==2) cnt+=(A[2]-left+A[0]);
                else if(i==0) cnt+=(A[0]-left);
            }
        }
        else{
            if(cnt>t){
                t+=(A[0]+A[2]);
                if(cnt<=t) cnt+=(t-cnt);
                else{
                    int left=(cnt-t)%total,i;
                    for(i=1;left>=A[i];i=(i+1)%3)
                        left-=A[i];
                    if(i==2) cnt+=(A[2]-left+A[0]);
                    else if(i==0) cnt+=(A[0]-left);
                }
            }
        }
    }
    printf("%lld",cnt);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值