题解-20200207
A-String Transformation
本题的题意:给你一个字符串,要你判断从这个字符串中通过将字符串的字符进行变化(从小往大变)能否得到a-z这26个字母,如果能,则将变化后的字符串输出,否则就输出-1.
解题思路:可以通过for循环遍历所给字符串的每一个字符。定义一个初始字符c=‘a’,假如当ptr[i]<=c,就说明ptr[i]可以通过该种变化变为c,同时将ptr[i]更新为c,进行完该操作后,c进行c++,即将c更新为下一个字母,当c>'z'时,即表明26个字母群都可以通过改变化获得,即可将该变化后的字符串输出,假如当循环结束,c<'z',即表明该字符串不符合题意,即可输出-1.
的最大值。(如果该集合中元素个数为0,则它的和为0) F-Zebras
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<stdio.h> #include<math.h> #include<string.h> #include<vector> #define ll long long using namespace std; int cmp(int a,int b){ return a>b; } ll read(){ ll x=0,w=1; char ch=0; while(ch<'0'||ch>'9'){ if(ch=='-') w=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return w*x; }//快读算法 bool IsPrimeNumber(int n){//判断该数是不是素数 if (n==2){ return true; } if (n%2==0||n==1){ return false; } int sqrtn=(int)sqrt((double)n); bool flag=true; for (int i=3;i<=sqrtn;i+=2){ if (n%i==0){ flag=false; } } return flag; }//快速判断某个数是不是素数的算法 void reversea(int t[],int n){ int temp[n]; for(int i=0;i<n;i++){ temp[i]=t[i]; } int r=0; for(int i=n-1;i>=0;i--){ t[r++]=temp[i]; } }//数组逆序函数 int main(){ string ptr; int f=0;//标记 string ans; cin>>ptr; int t=0; char c= 'a'; int num=0; for(int i=0;i<ptr.length();i++){ if(ptr[i]<=c){ ptr[i]=c; c++; num++; } if(num==26){ f=1; break; } } if(f==0){ cout<<-1<<endl; }else{ cout<<ptr<<endl; } return 0; }
B-Weird Subtraction Process
本题的题意:题目给处两个数a,b,要你判断当a,b经过一下两个步骤后,输出a,b的值。
1、当a=0或者b=0,结束这个程序,否则执行第二步。
2、当a>=2*b时,就令a=a-2*b,返回第一步继续执行,否则执行第三步。
3、当b>=2*a时,就令b=b-2*a,返回第一步继续执行,否则跳出循环,输出a,b。
解题思路:本题是一个题意简单的模拟题,但由于输入的数据范围太大,简单的进行过程模拟肯定会超时,所以,这里就需要利用技巧--“取余运算替换减法运算”,我们注意到,如果单纯的执行a=a-2*b,该步骤可能会执行很多次,但如果我们执行a=a%(2*b),即该步骤只会执行一次,这就大大的提高了执行的效率,而最终的运算结果是一样的。同理,用b=b%(2*a)替换步骤3中的运算。
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<stdio.h> #include<math.h> #include<string.h> #include<vector> #define ll long long using namespace std; int cmp(int a,int b){ return a>b; } ll read(){ ll x=0,w=1; char ch=0; while(ch<'0'||ch>'9'){ if(ch=='-') w=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return w*x; }//快读算法 bool IsPrimeNumber(int n){//判断该数是不是素数 if (n==2){ return true; } if (n%2==0||n==1){ return false; } int sqrtn=(int)sqrt((double)n); bool flag=true; for (int i=3;i<=sqrtn;i+=2){ if (n%i==0){ flag=false; } } return flag; }//快速判断某个数是不是素数的算法 void reversea(int t[],int n){ int temp[n]; for(int i=0;i<n;i++){ temp[i]=t[i]; } int r=0; for(int i=n-1;i>=0;i--){ t[r++]=temp[i]; } }//数组逆序函数 int main(){ ll a,b; cin>>a>>b; int f=1; while(1){ if(a==0||b==0){ break; } if(a>=2*b){ a=a%(2*b); }else if(b>=2*a){ b=b%(2*a); }else{ break; } } cout<<a<<" "<<b<<endl; return 0; }
C-Partition
本题题意:本题比较简单,题目给你一个数字序列,从中抽出若干个组成集合A,剩下的组成集合B,当然,也可以一个数字也不算抽,要你求
解题思路:遍历该数字序列,正数放到集合A,其余的放到集合B,这样求出来的结果是最大的。
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<stdio.h> #include<math.h> #include<string.h> #include<vector> #define ll long long using namespace std; int cmp(int a,int b){ return a>b; } ll read(){ ll x=0,w=1; char ch=0; while(ch<'0'||ch>'9'){ if(ch=='-') w=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return w*x; }//快读算法 bool IsPrimeNumber(int n){//判断该数是不是素数 if (n==2){ return true; } if (n%2==0||n==1){ return false; } int sqrtn=(int)sqrt((double)n); bool flag=true; for (int i=3;i<=sqrtn;i+=2){ if (n%i==0){ flag=false; } } return flag; }//快速判断某个数是不是素数的算法 void reversea(int t[],int n){ int temp[n]; for(int i=0;i<n;i++){ temp[i]=t[i]; } int r=0; for(int i=n-1;i>=0;i--){ t[r++]=temp[i]; } }//数组逆序函数 int main(){ int n; cin>>n; int num[10000]={0}; for(int i=0;i<n;i++){ cin>>num[i]; }//输入数据 sort(num,num+n);//从小到大 int suma=0; int sumb=0; int cmax=-1; for(int i=0;i<n;i++){//以 i 为基础 //取 i 个值 if(num[i]>0){ suma=suma+num[i]; }else{ sumb=sumb+num[i]; } } //suma大于0 sumb小于0 cout<<suma-sumb<<endl; return 0; }
F-Zebras
本题题意:给你一串“01”串,要你判断可以组成多少个“正确的序列”---“以0开头和以0结尾,并且其中0和1交替出现”,要注意的是串中每一个字符都必须要用到,假如不能构成正确的序列或者是有字符没有被用到则输出-1,否则输出总的数量以及每个字符的长度及坐标。
本题思路:利用二维vector,利用for循环遍历,当遇到‘0’时,放到vector中,当遇到‘1’时,放到上一个‘0’的后面,(注意放进去的该字符的坐标)
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<stdio.h> #include<math.h> #include<string.h> #include<vector> #define ll long long using namespace std; int cmp(int a,int b){ return a>b; } ll read(){ ll x=0,w=1; char ch=0; while(ch<'0'||ch>'9'){ if(ch=='-') w=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return w*x; }//快读算法 bool IsPrimeNumber(int n){//判断该数是不是素数 if (n==2){ return true; } if (n%2==0||n==1){ return false; } int sqrtn=(int)sqrt((double)n); bool flag=true; for (int i=3;i<=sqrtn;i+=2){ if (n%i==0){ flag=false; } } return flag; }//快速判断某个数是不是素数的算法 //================================== const int maxn=2e5+7; const int inf=0x3f3f3f3f; const int mod=1e9+7; const int EPS=1e-6; ll binarymod(ll a,ll b){ ll res=1; while(b){ if(b&1) res=(res*a)%mod; a=(a*a)%mod; b>>=1; } return res; } //利用二进制来算a的b次方的模板 //=================================== char s[maxn]; vector<int> a[maxn]; int main(){ scanf("%s",s+1); int len=strlen(s+1); int Max=-1,ans=0,flag=1; for(int i=1;i<=len&&flag;i++){ if(s[i]=='0'){ a[++ans].push_back(i); }else{ if(ans==0){ flag=0; } a[ans--].push_back(i); } Max=max(Max,ans); } if(Max!=ans){ flag=0; } if(flag==0){ cout<<-1<<endl; }else{ cout<<Max<<endl; for(int i=1;i<=Max;i++){ cout<<a[i].size(); for(int j=0;j<a[i].size();j++){ cout<<" "<<a[i][j]; } cout<<endl; } } return 0; }
G-Left-handers, Right-handers and Ambidexters
本题的题意:给你三种人:习惯用左手的(l)、习惯用右手(r)的以及左右手(a)都习惯用的,要你将这三种人分为两组,要求组中,使用左手和右手的人数一样,要你计算该组人数最多的人数。
解题思路:本题主要在于对数字a的处理上,我们可以先将a分给a、b两种情况(谁少分给谁),最后ans等于a、b中人数少的那一种的两倍。
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<stdio.h> #include<math.h> #include<string.h> #include<vector> #define ll long long using namespace std; int cmp(int a,int b){ return a>b; } ll read(){ ll x=0,w=1; char ch=0; while(ch<'0'||ch>'9'){ if(ch=='-') w=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return w*x; }//快读算法 bool IsPrimeNumber(int n){//判断该数是不是素数 if (n==2){ return true; } if (n%2==0||n==1){ return false; } int sqrtn=(int)sqrt((double)n); bool flag=true; for (int i=3;i<=sqrtn;i+=2){ if (n%i==0){ flag=false; } } return flag; }//快速判断某个数是不是素数的算法 void reversea(int t[],int n){ int temp[n]; for(int i=0;i<n;i++){ temp[i]=t[i]; } int r=0; for(int i=n-1;i>=0;i--){ t[r++]=temp[i]; } }//数组逆序函数 int main(){ int r,l,a; cin>>l>>r>>a; int ans=0; while(a){ if(l>r){ r++; }else{ l++; } a--; } if(l>r){ ans=2*r; }else{ ans=2*l; } cout<<ans<<endl; return 0; }