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;
}



京公网安备 11010502036488号