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;
}