Forum . Task Discussion . 0019 perket ไม่เข้าใจแนวคิด

ดูหน้านี้ใน รูปแบบเต็ม
tag: 0019

ตอนแรกผมก้คิดว่าบวกลบธรรมดาเฉยๆ
Code (C)
#include<stdio.h>

#include<math.h>

int main(){

    int N,i,S,B,mul=1,add=0,all;

    scanf("%d",&N);

    for(i=0;i<N;i++){

        scanf("%d%d",&S,&B);

        if(S==1){

            S=1;

            B=0;

        }

        mul*=S;

        add+=B;

        

    }

    all=fabs(mul-add);

    

    printf("%d",all);

    return 0;

}

โดย phopha19 เมื่อ 26 May 2563 08:51:56


#1 โดย phopha19 เมื่อ 26 May 2563 08:53:42
ขอแนวคิดและขอคำแนะนำด้วยคับ

#2 โดย 15533 เมื่อ 26 May 2563 10:11:07
แนวคิดก็คือหาว่าจะเอาส่วนผสมไหน หรือไม่เอาส่วนผสมไหนมาใส่ เพื่อที่จะได้ผลต่างระหว่างผลคูณของความเปรี้ยวและผลบวกของความขมน้อยที่สุด

สำหรับวิธีหาว่าจะเอาส่วนผสมไหนหรือไม่เอาส่วนผสมไหน ก็อาจใช้วิธี brute force เพื่อทดสอบทุกกรณีเลย อย่างในตัวอย่างที่ 3
2
3 8
5 8

ถ้าเราลองดูทุกกรณีก็จะได้เป็น
mul             add              all
Case 1 [3,8]:
3                8           |3-8|=5
Case 2 [5,8]:
5                8           |5-8|=3
Case 3 [3,8] & [5,8]:
3×5=15         8+8=16      |15-16|=1

จะเห็นได้ว่ากรณี 3 ผลต่างมีค่าน้อยสุดคือ 1 ดังนั้น 1 จึงเป็นคำตอบ

#3 โดย phopha19 เมื่อ 27 May 2563 09:31:27
ขอตัวอย่างที่รับค่ามากกว่า2หน่อยคับ


#4 โดย 15533 เมื่อ 27 May 2563 10:59:26
4
1 7
2 6
3 8
4 9

mul                   add               all
1=1                7=7                |7-1|=6
2=2                6=6                |6-2|=4
1*2=2              7+6=13             |13-2|=11
3=3                8=8                |8-3|=5
1*3=3              7+8=15             |15-3|=12
2*3=6              6+8=14             |14-6|=8
1*2*3=6            7+6+8=21           |21-6|=15
4=4                9=9                |9-4|=5
1*4=4              7+9=16             |16-4|=12
2*4=8              6+9=15             |15-8|=7
1*2*4=8            7+6+9=22           |22-8|=14
3*4=12             8+9=17             |17-12|=5
1*3*4=12           7+8+9=24           |24-12|=12
2*3*4=24           6+8+9=23           |23-24|=1
1*2*3*4=24         7+6+8+9=30         |30-24|=6


#5 โดย lookharm เมื่อ 27 May 2563 18:52:35
เป็น subset ครับ
สมมติ n = 3
ให้ A, B, C เป็นตัวแทนแต่ละส่วนผสม
จะได้
{A}
{B}
{C}
{A,B}
{A,C}
{B,C}
{A,B,C}
จะได้รูปแบบทั้งหมด 2^3 - 1 = 7
ให้แต่ละ set มาผสมกันเองภายใน ลองดูครับ
แก้ไขล่าสุด 27 May 2563 18:53:21

#6 โดย yahol hoho เมื่อ 27 May 2563 19:49:50
ขอเสริมช่วยนะครับ ข้อนี้ผมไปศึกษาแนวคิดของ Tower of Hanoi มาครับ แล้วก็เรื่องของ combination กับ permutation มาครับ เป็นกำลังใจให้นะครับ สู้ๆ

#7 โดย phopha19 เมื่อ 04 Jun 2563 08:15:48
ขอบคุณทุกคนมากๆๆๆเลยคับ

#8 โดย phopha19 เมื่อ 04 Jun 2563 08:18:23
ถึงอย่างไรผมก้ไม่ผ่าน คิดทั้งวันทั้งคืนนี้ก้เป้นเดือนละ โครตเจ้บห้วเลย
ท้อมากๆเลย ช่วยดูโค้ดให้ผมอีกทีได้ไหมคับ
แก้ไขล่าสุด 04 Jun 2563 15:15:04

#9 โดย phopha19 เมื่อ 04 Jun 2563 08:20:01
ผมได้เป้นPX-XXPX ช่วยด้วยคับ ติดข้อนี้เป้นเดือนเลยคับ

#10 โดย phopha19 เมื่อ 04 Jun 2563 08:20:41
Code (C)
#include<stdio.h>

#include<math.h>

#include<stdlib.h>

int main(){

   int i,j,N;

   int a,c,r;

  int b=1,b1=0;

   int s=0;

   int d,get;

   

   scanf("%d",&N);

   

   int bit[N],min[N];

   int num[N],num1[N];

   for(i=0;i<N;i++){

   scanf("%d%d",&num[i],&num1[i]);

   }

   for(i=1;i<=pow(2,N)-1;i++){

      a=i;

        for(j=N-1;j>=0;j--){

          c=a/2;

          r=a-(2*c);

          a=c;

          bit[j]=r;

          if(bit[j]==1){

               b=b*num[j];

               b1=b1+num1[j];      

               //  printf("%d ",num1[j]);

           }

       if(j==0){

         b=abs(b1-b);

         min[s]=b;

         //printf("%d",num[j]);

          s++;                   

        }       

        }

      //  printf("\n");

   b1=0;

   b=1;

 }

 get=min[0];

 for(i=0;i<N;i++){

     if(get>min[i+1]&&min[i+1]!=N){

         d=get;

         get=min[i+1];

         min[i+1]=d;

    }

    /* if(min[i]>min[i+1]&&min[i+1]!=N){

          get=min[i];

          min[i]=min[i+1];

          min[i+1]=get;

      }*/

  }

  printf("%d",get); 

}