http://codeforces.com/problemset/problem/318/A
মজাদার একটা প্রবলেম , আমাদের শুধু একটু মাথা খাটাতে হবে এই আর কি । আমাদের একটা সংখ্যা n দেয়া থাকবে , আমাদের একটা লিস্ট বানাতে হবে -- প্রথমে , ১ থেকে n অবদি -- যতগুলি বিজোড় সংখ্যা আছে , সেগুলি লিখবো ছোট থেকে বড় আকারে । তারপর , আবার , ১ থেকে n অবদি যত গুলি জোড় সংখ্যা আছে , সেগুলিই ছোট থেকে বড় আকারে লিখবো । এখন আমাদের আরো একটা সংখ্যা দেয়া থাকবে - সেটা হলো , k আমাদের এখন প্রিন্ট করতে হবে এই লিস্ট এর k তম মান কত হবে ??
এটা কিন্তু , খুব সহজেই লুপ খাটিয়েই করা যায় -- কিন্তু , আমাদের তো একটু বুদ্ধি খাটাতেই হবে তাই না ?? না হলে , টাইম লিমিট খেয়ে যেতে পারি ।
এখন যদি দেয়া থাকে , জোড় সংখ্যা ( যেমন, ১০ ) । । তাহলে , আমাদের লিস্ট'টা হবে - এরকম , ( ১ ৩ ৫ ৭ ৯ ২ ৪ ৬ ৮ ১০ ) ।। এখন যদি , k এর মান দেয়া থাকে ৩ তাহলে , আমাদের উত্তর হবে ৫ , যদি , k এর মান দেয়া থাকে ৬ তাহলে , আমাদের উত্তর হবে ২ । ।
এখন , এখানে - আমরা যদি দেয়া মান ১০ এর অর্ধেক , একটা ভ্যারিয়েবলে - রাখি , যেমন - int part = n / 2 = 10 / 2 = 5 ; এখন যদি বলে , ( k = 4 ) তম মান কতো ??? তাহলে , কি করা যায় ?? 2*k-1 = 7
আসে , তাই না /? ??? হুম , কিন্তু যখন বলবে , ( k = 6) তখন কি করবে ?? 2*k-1 = 11 বের করবে ??? তাহলে তো হচ্ছে না ,কি করা যায় ??? হুম , (k-part)*2 = ২ হবে , আসল উত্তর ।
যাই হোক , বিজোড় থাকলে - part নেবার সময় একটু ঝামেলা আছে , তাছাড়া আর সমস্যা নাই । সবকিছুই এক ---লজিক , চলো এবার কোড দেখে আসি ------------
IN C++ Language..................................
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n,k,part,output;
cin>>n>>k;
if(n%2==0)
{
part=n/2;
}
else
{
part=(n/2)+1;
}
if(k<=part)
{
output=(2*k)-1;
}
else
{
output=(k-part)*2;
}
cout<<output<<endl;
return 0;
}
IN C# LANGUAGE........................
using System;
class Exercise11
{
static void Main()
{
long part,output;
string s=Console.ReadLine();
string[] values=s.Split(' ');
long n=long.Parse(values[0]);
long k=long.Parse(values[1]);
if(n%2==0)
{
part=n/2;
}
else
{
part=(n/2)+1;
}
if(k<=part)
{
output=(2*k)-1;
}
else
{
output=(k-part)*2;
}
Console.WriteLine(output);
}
}
মজাদার একটা প্রবলেম , আমাদের শুধু একটু মাথা খাটাতে হবে এই আর কি । আমাদের একটা সংখ্যা n দেয়া থাকবে , আমাদের একটা লিস্ট বানাতে হবে -- প্রথমে , ১ থেকে n অবদি -- যতগুলি বিজোড় সংখ্যা আছে , সেগুলি লিখবো ছোট থেকে বড় আকারে । তারপর , আবার , ১ থেকে n অবদি যত গুলি জোড় সংখ্যা আছে , সেগুলিই ছোট থেকে বড় আকারে লিখবো । এখন আমাদের আরো একটা সংখ্যা দেয়া থাকবে - সেটা হলো , k আমাদের এখন প্রিন্ট করতে হবে এই লিস্ট এর k তম মান কত হবে ??
এটা কিন্তু , খুব সহজেই লুপ খাটিয়েই করা যায় -- কিন্তু , আমাদের তো একটু বুদ্ধি খাটাতেই হবে তাই না ?? না হলে , টাইম লিমিট খেয়ে যেতে পারি ।
এখন যদি দেয়া থাকে , জোড় সংখ্যা ( যেমন, ১০ ) । । তাহলে , আমাদের লিস্ট'টা হবে - এরকম , ( ১ ৩ ৫ ৭ ৯ ২ ৪ ৬ ৮ ১০ ) ।। এখন যদি , k এর মান দেয়া থাকে ৩ তাহলে , আমাদের উত্তর হবে ৫ , যদি , k এর মান দেয়া থাকে ৬ তাহলে , আমাদের উত্তর হবে ২ । ।
এখন , এখানে - আমরা যদি দেয়া মান ১০ এর অর্ধেক , একটা ভ্যারিয়েবলে - রাখি , যেমন - int part = n / 2 = 10 / 2 = 5 ; এখন যদি বলে , ( k = 4 ) তম মান কতো ??? তাহলে , কি করা যায় ?? 2*k-1 = 7
আসে , তাই না /? ??? হুম , কিন্তু যখন বলবে , ( k = 6) তখন কি করবে ?? 2*k-1 = 11 বের করবে ??? তাহলে তো হচ্ছে না ,কি করা যায় ??? হুম , (k-part)*2 = ২ হবে , আসল উত্তর ।
যাই হোক , বিজোড় থাকলে - part নেবার সময় একটু ঝামেলা আছে , তাছাড়া আর সমস্যা নাই । সবকিছুই এক ---লজিক , চলো এবার কোড দেখে আসি ------------
IN C++ Language..................................
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n,k,part,output;
cin>>n>>k;
if(n%2==0)
{
part=n/2;
}
else
{
part=(n/2)+1;
}
if(k<=part)
{
output=(2*k)-1;
}
else
{
output=(k-part)*2;
}
cout<<output<<endl;
return 0;
}
IN C# LANGUAGE........................
using System;
class Exercise11
{
static void Main()
{
long part,output;
string s=Console.ReadLine();
string[] values=s.Split(' ');
long n=long.Parse(values[0]);
long k=long.Parse(values[1]);
if(n%2==0)
{
part=n/2;
}
else
{
part=(n/2)+1;
}
if(k<=part)
{
output=(2*k)-1;
}
else
{
output=(k-part)*2;
}
Console.WriteLine(output);
}
}
lol
ReplyDeleteyeah,good
ReplyDeleteThank you so much.
ReplyDelete