CCF CSP小明放課後c++java python csp 201812_2 100点

5899 ワード

CCF CSP小明放課後c++java python csp 201812_2 100点
タイトルの背景には、漢東省政法大学付属中学校がある光明区が最近、「知恵光明」という知恵都市プロジェクトを実施した.具体的には、交通分野では、「知恵の光明」端末を通じて、光明区のすべての信号がこの時の状態を見ることができる.明ちゃんの学校にも「知恵の光明」端末が設置されており、明ちゃんはこの端末から与えられた情報を利用して、学校が終わって家に帰る時間を試算したいと思っています.学校が終わると、明ちゃんは自分の家に帰るルートを計画し、各区間を通る時間を予測することができます.また、明ちゃんは学校に設置された「知恵の光」端末を通じて、出発時刻に道を通るすべての信号の指示状態を見た.明ちゃんが今度家に帰るのに必要な時間を計算してください.入力フォーマット入力の最初の行には、信号の設定を表す3つの正の整数r、y、gがスペースで区切られています.この3つの数はいずれも106を超えない.入力された2行目には、明ちゃんが全部で通った道路区間数と通りかかった信号の数を表す正の整数nが含まれています.次のn行は、各行にスペースで区切られた2つの整数k、tを含む.k=0は、道路を通過するのにt秒かかることを示し、ここでtは106を超えない.k=1、2、3の場合、それぞれ出発時刻を示し、ここでの信号状態は赤、黄、青であり、カウントダウン表示板に表示される数字はtであり、ここでtはそれぞれr、y、gを超えない.出力フォーマットは、今回の明ちゃんが学校から家に帰るのに費やした時間を示す数字を出力します.サンプル入力30 3 30 8 0 10 1 5 0 11 2 0 6 0 3 3 10 0 3サンプル出力46サンプルは、明ちゃんが最初のルートを通って、10秒かかります.最初の信号は赤信号で、まだ5秒残っています.明ちゃんが交差点に着いたとき、この信号はもう青になったので、直接通過するのを待つ必要はありません.次に2段目の道を通って、11秒かかります.2番目の信号は黄色で、あと2秒です.明ちゃんが交差点に着いたとき、この信号はもう赤信号になって、まだ11秒残っています.次に3、4段目の道を通って、9秒かかります.3番目の信号は出発時に信号で、まだ10秒残っています.明ちゃんが交差点に着いたとき、この信号はもう赤信号になって、あと2秒残っています.次は最後の道を通って、3秒かかります.合計10+11+11+9+2+3=46秒.評価例の規模と所定のいくつかの試験点は特殊な性質を有している:*最初の2つの試験点には信号ランプが存在しない.試験点の入力データ規模:*上位6試験点保証n≦103.*すべての試験点はn≦105を保証する.もんだいぶんせき       この問題は第一問題と比較して一定の難易度があり、出発時刻の各交差点の信号の残り時間を与えているので、明ちゃんが交差点を通るとき、交差点であれば計算する必要はありません.交差点を通る時間を直接加えればいいです.交差点ではなく、交通灯であれば、まずこの交通灯が現在ある状態を計算する必要があります.そして状況・状況によって待ち時間を計算します.その中で、交通灯の法則は赤信号、青信号、黄色灯が交互になっている.       この問題はデータ規模が大きいため、*intタイプがオーバーフローするため、結果的にlongタイプで保存されます.これも満点を取らない人が多い理由です.**でもpythonを使うならこの問題は考えなくてもいいです.c++コードは以下の通りです.
#include
typedef long long ll;
int main(){
	int r,y,g;
	scanf("%d%d%d",&r,&y,&g);
	int count;
	scanf("%d",&count);
	int index,time;
	ll result = 0;
	ll total = r + y + g;
	for(int i = 0;i < count;i++){
		scanf("%d%d",&index,&time);
		if(index == 0){
			result += time;
		}
		else if(index == 1){
			ll temp = result % total;
			if(temp < time){
				result += (time - temp);
			}
			else {
				if(temp > time + g){
					if(temp < time + g + y){
						ll tt = temp - time - g;
						result += (r + y - tt);
					}
					else{
						ll tt = temp - time - g - y;
						result += (r - tt);
					}
				}
			}	
		}
		else if(index == 2){
			ll temp = result % total;
			if(temp < time){
				result += (time - temp + r);
			}
			else{
				if(temp < time + r){
					ll tt = temp - time;
					result += (r - tt);
				}
				else if(temp > time + r + g){
					ll tt = temp - time - r - g;
					result += (y - tt + r); 
				}
			}
		}
		else{
			ll temp = result % total;
			if(temp > time){
				if(temp < time + y){
					ll tt = temp - time;
					result += (y - tt + r);
				}
				else{
					if(temp < time + y + r){
						ll tt = temp - time - y;
						result += (r - tt);
					}
				}
			}
		}
	}
	printf("%lld
",result); return 0; }

JAvaコードは以下の通りです
import java.util.Scanner;

public class csp201812_2 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int r = input.nextInt();
		int y = input.nextInt();
		int g = input.nextInt();
		int count = input.nextInt();
		long total = r + y + g;
		long result = 0;
		int index;
		int time;
		for(int i = 0;i < count;i++){
			index = input.nextInt();
			time = input.nextInt();
			if(index == 0){
				result += time;
			}
			else if(index == 1){
				long temp = result % total;
				if(temp < time){
					result += (time - temp);
				}
				else {
					if(temp > time + g){
						if(temp < time + g + y){
							long tt = temp - time - g;
							result += (r + y - tt);
						}
						else{
							long tt = temp - time - g - y;
							result += (r - tt);
						}
					}
				}	
			}
			else if(index == 2){
				long temp = result % total;
				if(temp < time){
					result += (time - temp + r);
				}
				else{
					if(temp < time + r){
						long tt = temp - time;
						result += (r - tt);
					}
					else if(temp > time + r + g){
						long tt = temp - time - r - g;
						result += (y - tt + r); 
					}
				}
			}
			else{
				long temp = result % total;
				if(temp > time){
					if(temp < time + y){
						long tt = temp - time;
						result += (y - tt + r);
					}
					else{
						if(temp < time + y + r){
							long tt = temp - time - y;
							result += (r - tt);
						}
					}
				}
			}
		}
		System.out.println(result);
		input.close();
	}

}


python 3コードは以下の通りです.
ryg = input().split(" ")
r = (int)(ryg[0])
y = (int)(ryg[1])
g = (int)(ryg[2])
count = (int)(input())
total = r + y + g
result = 0
for i in range(count):
    te = input().split()
    index = (int)(te[0])
    time = (int)(te[1])
    if index == 0:
        result += time
    elif index == 1:
        temp = result % total
        if temp < time:
            result += (time - temp)
        else:
            if temp > time + g:
                if temp < time + g + y:
                    tt = temp - time - g
                    result += (r + y - tt)
                else:
                    tt = temp - time - g - y
                    result += (r - tt)
    elif index == 2:
        temp = result % total
        if temp < time:
            result += (time - temp + r)
        else :
            if temp < time + r:
                tt = temp - time
                result += (r - tt)
            elif temp > time + r + g:
                tt = temp - time - r - g
                result += (y - tt + r)
    else :
        temp = result % total
        if temp > time:
            if temp < time + y:
                tt = temp - time
                result += (y - tt + r)
            else:
                if temp < time + y + r:
                    tt = temp - time - y
                    result += (r - tt)
print(result)

ok!大きな成果を収めました.もっと良い方法があれば、コメントエリアで交流することができますよ.