Codeforces Round #665 (Div. 2)A-C题解
作者:互联网
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; }
标签:typedef,int,题解,665,个数,ans,Div,ll,define 来源: https://www.cnblogs.com/xiaofengzai/p/13545993.html