アルゴリズムチャレンジ-10
1244スイッチオン/オフ
質問する
1から連続番号のスイッチがあります.スイッチはオンまたはオフの状態です.<「図1>8個のスイッチの状態を示しています.」「1」はスイッチがオンになっていることを示し、「0」はオフになっていることを示します.そして何人かの学生を選び、学生たちにスイッチ数以下の自然数を1つ以上分けます.学生たちは自分の性別や受け取った数に応じて、以下のようにスイッチを操作します.
男性はスイッチ番号が自分が受け取った数字の倍数であれば、スイッチの状態を変えます.スイッチが入ったままで、閉まったままで.<図1>に示すように、男子生徒が3を取得すると、その生徒は図2>に示すように、3番、6番のスイッチの状態を変更する.
女性は自分が受け取った数字が同じスイッチを中心に、左右対称で最も多くのスイッチが含まれているセグメントを探して、そのセグメントに属するすべてのスイッチの状態を変えます.このとき区間に属するスイッチ数は常に奇数である.
例えば、<図2>で女子生徒が3を得た場合、3番スイッチを中心に、2番、4番スイッチの状態は同じ、1番、5番スイッチの状態は同じ、<図3>のように、1番から5番スイッチの状態を全て変える.<図2>で女子が4,3,5番スイッチを得た状態が異なる場合は、4番スイッチの状態だけを変更します.
スイッチの初期状態、学生ごとの性別、受信数を入力します.学生たちが入力順に、自分の性別や受け取ったスイッチ数でスイッチの状態を変える場合は、スイッチの最後の状態を出力するプログラムを作成してください.
入力
最初の行はスイッチ数を与えます.スイッチ個数は100以下の正の整数です.2行目は、各スイッチの状態を示します.開いて1、閉じて0、真ん中にスペースがあります.3行目は学生数を与える.学生数は100以下の正の整数です.4行目から最後の行まで、各行は学生の性別、学生が受け取った数字を与えます.男子は1、女子は2で、生徒はスイッチ数以下の正の整数を受け取る.学生の性別と人数の間にスペースがあります.
しゅつりょく
スイッチの状態は1番スイッチから、最後のスイッチまで、行ごとに20個出力します.例えば、21番のスイッチがあれば、そのスイッチの状態は2行目の一番前に出力されます.オンのスイッチは1、オフのスイッチは0と表示され、スイッチ状態の間にスペースが配置されます.
入力例
8
0 1 0 1 0 0 0 1
2
1 3
2 3
サンプル出力
1 0 0 0 1 1 0 1
コード#コード#
import java.lang.reflect.Array;
import java.util.*;
public class Main{
public static int[] switchList;
public static int[][] studentList;
public static int switchQuantity;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
switchQuantity = scanner.nextInt();
switchList= new int[switchQuantity];
int i;
for(i=0;i<switchQuantity;i++){
switchList[i]=scanner.nextInt();
}
int studentCount = scanner.nextInt();
studentList = new int[studentCount][2];
for(i=0;i<studentCount;i++){
studentList[i][0]=scanner.nextInt();
studentList[i][1]=scanner.nextInt();
}
for(i=0;i<studentCount;i++){
if(studentList[i][0]==1){
man(studentList[i][1]);
}else if(studentList[i][0]==2){
woman(studentList[i][1]);
}
}
for(int j=0;j<switchQuantity;j++){
if(j==0){
System.out.print(switchList[j]+" ");
}
else if(j!=0&&j%20!=0){
System.out.print(switchList[j]+" ");
}else if(j!=0&&j%20==0){
System.out.println(" ");
System.out.print(switchList[j]+" ");
}
}
}
public static void man(int number){
for(int i=0; i<switchQuantity;i++){
if((i+1)%number==0){
if(switchList[i]==0){
switchList[i]=1;
}else if(switchList[i]==1){
switchList[i]=0;
}
}
}
}
public static void woman(int number){
int sameNumberCount=0;
for(int i=0;i<number;i++){
if(i+1==number){
sameNumberCount+=1;
}else if((2*(number-1)-i <switchQuantity)&&switchList[i]==switchList[2*(number-1)-i]){
sameNumberCount+=1;
}else if((2*(number-1)-i <switchQuantity)&&switchList[i]!=switchList[2*(number-1)-i]){
sameNumberCount=0;
}
}
if(sameNumberCount==1){
if(switchList[number-1]==1){
switchList[number-1]=0;
}else if(switchList[number-1]==0){
switchList[number-1]=1;
}
}else{
for(int n=number-1;n<number+sameNumberCount-1;n++){
if(n==number-1){
if(switchList[number-1]==1){
switchList[number-1]=0;
}else if(switchList[number-1]==0){
switchList[number-1]=1;
}
}else{
if(switchList[n]==1){
switchList[n]=0;
switchList[number-1-(n-number+1)]=0;
}else if(switchList[n]==0){
switchList[n]=1;
switchList[number-1-(n-number+1)]=1;
}
}
}
}
}
}
Reference
この問題について(アルゴリズムチャレンジ-10), 我々は、より多くの情報をここで見つけました https://velog.io/@kimchiwarrior/알고리즘-도전기-10テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol