只出了两道题,c题想了半天没有思路,与自己学的知识都对不上号,遇到个特殊问法就直接懵了,还是做题做得少,代码实现能力不强,对字符串的操作也不够熟练,以后要多多练习这一方面 ,刷题还是要分专题的刷,这样记得才会牢固,对问题的敏感度才会提高,不然拿过一道题来看着啥题型都像或者啥都不像就不大好了
A题
答案要么是1,要么是0,加起来的总和能被2整除就是0,否则为1
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<iomanip>
#include<map>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define CHECK(x,y) (x>0&&x<=n&&y>0&&y<=m)
const int inf=0x3f3f3f3f;
const int mod=1e9;
const int N=1e6+5;
using namespace std;
int main(){
//freopen("in.txt","r",stdin);
int t,a,b,c;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&a,&b,&c);
int sum=a*1+b*2+c*3;
if(sum%2==0) cout<<0<<endl;
else cout<<1<<endl;
}
return 0;
}
B题
统计1和0的个数m1和m0,0有两个选择,要么选上要么不选,答案就是1的个数乘以2的m0次方
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<iomanip>
#include<map>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define CHECK(x,y) (x>0&&x<=n&&y>0&&y<=m)
const int inf=0x3f3f3f3f;
const int mod=1e9;
const int N=1e6+5;
using namespace std;
int main(){
//freopen("in.txt","r",stdin);
int t,n,a[66];
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int m1=0,m0=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]==0) m0++;
if(a[i]==1) m1++;
}
ll ans=m1*pow(2,m0);
cout<<ans<<endl;
}
return 0;
}
C Grandma Capa Knits a Scarf
用贪心的思想,在网上看题解说是双指针,其实就是把26个字母都遍历一遍,用l从头开始遍历,用r从尾部开始遍历,s[l]==s[r]就l++,r--,若不等则若s[l]==c,说明这个字符可以删,l再后移,否则如果s[r]==c,说明字符可以删,r前移,若都不等于这个字符,说明删除这个字符是构不成回文串的,让cnt等于个最大值直接break掉循环,开始试删下一个字母
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<iomanip>
#include<map>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define CHECK(x,y) (x>0&&x<=n&&y>0&&y<=m)
const int inf=0x3f3f3f3f;
const int mod=1e9;
const int N=1e6+5;
using namespace std;
int main(){
//freopen("in.txt","r",stdin);
int t,n;
char s[100005];
scanf("%d",&t);
while(t--){
scanf("%d%s",&n,s+1);
int ans=-1;
for(char c='a';c<='z';++c){
int cnt=0,l=1,r=n;
while(l<r){
if(s[l]==s[r]) ++l,--r;
else{
if(s[l]==c) ++l,++cnt;
else if(s[r]==c) --r,++cnt;
else {cnt=1e9;break;}
}
}
if(cnt!=1e9&&(ans==-1||cnt<ans)) ans=cnt;
}
cout<<ans<<endl;
}
return 0;
}
D Vupsen, Pupsen and 0
如果n为偶数,两两凑0,比如x,y,在b中就是-y,x;
如果n为奇数,从1到n-1重复上面的步骤,然后对b[1]和b[n]做操作(让前两个数和最后一个数构造0就行)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<iomanip>
#include<map>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define CHECK(x,y) (x>0&&x<=n&&y>0&&y<=m)
const int inf=0x3f3f3f3f;
const int mod=1e9;
const int N=1e6+5;
using namespace std;
int main(){
//freopen("in.txt","r",stdin);
int t,n,a[100005],b[100005];
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),b[i]=0;
if(!(n&1)){
for(int i=1;i<=n;i++)
if(i&1)b[i]=a[i+1];
else b[i]=-a[i-1];
}
else{
for(int i=1;i<n;i++)
if(i&1) b[i]=a[i+1];
else b[i]=-a[i-1];
while(b[1]==0||b[n]==0){
b[n]+=a[1];
b[1]-=a[n];
}
}
for(int i=1;i<=n;i++)
cout<<b[i]<<" ";
cout<<endl;
}
return 0;
}
F1 Korney Korneevich and XOR (easy version)
求上升子序列(所有)的异或和有几个,分别输出;f[j]代表异或和为j时最后一个元素值
(2条消息) F1 - Korney Korneevich and XOR (easy version)(暴力+简单DP)_Silly_d0g的博客-CSDN博客
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<iomanip>
#include<map>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define CHECK(x,y) (x>0&&x<=n&&y>0&&y<=m)
const int inf=0x3f3f3f3f;
const int mod=1e9;
const int N=1e6+5;
using namespace std;
int main(){
// freopen("in.txt","r",stdin);
int n,x,f[520];
scanf("%d",&n);
memset(f,inf,sizeof(f));
for(int i=1;i<=n;i++){
scanf("%d",&x);
f[x]=min(f[x],x);
for(int j=0;j<=512;j++)
if(x>=f[j]) f[j^x]=min(f[j^x],x);
}
set<int>s;
for(int i=0;i<=512;i++) if(f[i]!=inf) s.insert(i);
cout<<s.size()<<endl;
for(auto it:s){
cout<<it<<" ";
}
cout<<endl;
return 0;
}