A. Distance and Axis
題目:http://codeforces.com/contest/1401/problem/A
題解:對於n來說分兩種情況,一是奇數,二則是偶數
①奇數:對於k來說如果是奇數且小於等於他,ans=0;若k是奇數並且大於n,則ans=k-n;若k是偶數並且k<n,那麼ans=1;若k為偶數並且k>n,則ans=k-n
②偶數:若k為偶數並且k<=n,則ans=0;若k為偶數並且k>n,則ans=k-n;若k為奇數並且k<n,則ans=1;若k為奇數並且k>n,則ans=k-n
程式碼:
#include<bits/stdc++.h> //POJ不支援
#define rep(i,a,n) for (int i=a;i<=n;i++)//i為迴圈變數,a為初始值,n為界限值,遞增
#define per(i,a,n) for (int i=a;i>=n;i--)//i為迴圈變數, a為初始值,n為界限值,遞減。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int inf = 0x3f3f3f3f;//無窮大
//const int maxn = ;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
int main()
{
IOS;
ll t,n,k;
cin>>t;
while(t--)
{
cin>>n>>k;
if(n%2==0)
{
if(k%2==0&&k<=n)
cout<<"0"<<endl;
else if(k%2==0&&k>n)
cout<<k-n<<endl;
else if(k%2==1&&k<n)
cout<<"1"<<endl;
else if(k%2==1&&k>n)
cout<<k-n<<endl;
}
else
{
if(k%2==0&&k<n)
cout<<"1"<<endl;
else if(k%2==0&&k>n)
cout<<k-n<<endl;
else if(k%2==1&&k<=n)
cout<<"0"<<endl;
else if(k%2==1&&k>n)
cout<<k-n<<endl;
}
}
return 0;
}
B. Ternary Sequence
題目:http://codeforces.com/contest/1401/problem/B
題解:若想最大,只有讓儘可能多的a陣列中的2去匹對b陣列中的1,這樣就都是正的。但也會存在負數,如何才能達到最大化呢?一道典型的貪心思路問題
首先判斷a中2的個數是否大於b中1的個數
若大於b中1的個數,ans=2*y2,在判斷a中0的個數和剩下的2的個數是否大於b陣列中2的個數,若大於,答案還是ans;若小於,則b陣列中剩下的2的個數將要和a陣列中的1的個數進行配對,產生負數,則ans-=2*z2
若小於b中的1的個數,ans=2*z1,然後判斷a中0的個數是否大於b中2的個數,若大於,答案就是ans;若小於,則b陣列中剩下的2的個數將要和a陣列中1的個數進行配對,產生負數,則ans-=2*z2
程式碼:
#include<bits/stdc++.h> //POJ不支援
#define rep(i,a,n) for (int i=a;i<=n;i++)//i為迴圈變數,a為初始值,n為界限值,遞增
#define per(i,a,n) for (int i=a;i>=n;i--)//i為迴圈變數, a為初始值,n為界限值,遞減。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int inf = 0x3f3f3f3f;//無窮大
//const int maxn = ;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
int main()
{
IOS;
ll t,x1,x2,y1,y2,z1,z2;
cin>>t;
while(t--)
{
cin>>x1>>y1>>z1;
cin>>x2>>y2>>z2;
ll ans=0;
if(z1>=y2)
{
ans+=2*y2;
z1-=y2;
if(x1+z1<z2)
{
z2=z2-(x1+z1);
ans-=2*z2;
}
}
else
{
ans+=2*z1;
if(x1<z2)
{
z2-=x1;
ans-=z2*2;
}
}
cout<<ans<<endl;
}
return 0;
}
C. Mere Array
題目:http://codeforces.com/contest/1401/problem/C
題解:用兩個陣列來判斷,其一陣列來記錄數字,另一陣列排序形成最終的答案陣列。
然後我們理解一下,第i個第j個數交換位置,相當於第i個數先和最小數交換,然後最小數在和第j個數交換。因此,從頭到尾對比兩個陣列,如果數字不一致,判斷原來陣列是否整除最小數,如果不能整除代表此位置不能交換,因而不會形成最終的不遞減陣列。
程式碼:
#include<bits/stdc++.h> //POJ不支援
#define rep(i,a,n) for (int i=a;i<=n;i++)//i為迴圈變數,a為初始值,n為界限值,遞增
#define per(i,a,n) for (int i=a;i>=n;i--)//i為迴圈變數, a為初始值,n為界限值,遞減。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int inf = 0x3f3f3f3f;//無窮大
const int maxn = 100010;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
ll a[maxn],b[maxn];
int main()
{
IOS;
int t,i,j,n,tmp;
cin>>t;
while(t--)
{
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(a,a+n);
bool flag=false;
for(i=0;i<n;i++)
{
if(a[i]!=b[i])
{
if(b[i]%a[0]!=0)
{
flag=true;
break;
}
}
}
if(flag==true)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}