G Lucky 7 in the Pocket
签到题,然而因为刚睡醒打错一个字母WA了三次,还活生生改不出来,重构才过,?,队友们,我对不起你们。。。
# include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
for(int j=0;j<t;j++){
if(j!=0) printf("\n");
int a;
scanf("%d",&a);
if(a%7==0&&a%4!=0){
printf("%d",a);
continue;
}
int d=(a/7+1)*7;
for(int i=d;;i++){
if(i%7==0&&i%4!=0){
printf("%d",i);
break;
}else{
continue;
}
}
}
return 0;
}
F Abbreviation
另一个签到题,除了首字母位置上的,其他位置上的元音字母不输出就行
# include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if(i==0){
printf("%c",s[i]);
}else{
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='y'||s[i]=='o'||s[i]=='u'){
continue;
}else{
printf("%c",s[i]);
}
}
}
printf("\n");
}
return 0;
}
I Fibonacci in the Pocket
可以打表得到斐波那契函数的奇偶情况,(奇数输出1,偶数输出0),发现是以三个一循环的
在发现这个规律后,再来考虑这个问题。每三个一循环,那么数就变成了偶数,0是偶数,可以用0来代替其他偶数,1是奇数,可以代替其他奇数,那么只要算除了完整循环之外的就行(感觉没有说清楚,看代码吧QAQ),有一个坑点就是要注意是否在区间里面有完整的循环,这一点很重要,不是完整循环的单独出来考虑
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int t;
scanf("%d",&t);
while(t--){
string a,b;
LL as=0,bs=0;
LL sum=0;
cin>>a;
cin>>b;
int lena=a.length();
int lenb=b.length();
int l=lena-1;
int flag1=0;
int aa=a[l]-'0';
int bb=b[l]-'0';
if(lenb==lena){
for(int i=0;i<lena;i++){
if(a[i]==b[i]) continue;
else{
l=i;
}
}
if(l!=(lena-1)) flag1=1;
else{
if((bb-aa)>=3) flag1=1;
}
}
//cout<<"@"<<flag1<<endl;
if((lena!=lenb)||flag1){
for(int i=0;i<a.length();i++){
int d=a[i]-'0';
as=((as%3)+(d%3))%3;
}
as=as%3;
//cout<<"a"<<" "<<as<<endl;
if(as==0){
sum+=0;
}else if(as==1){
sum+=2;
}else if(as==2){
sum+=1;
}
for(int i=0;i<b.length();i++){
int d=b[i]-'0';
bs=((bs%3)+(d%3))%3;
}
bs=bs%3;
//cout<<"b"<<" "<<bs<<endl;
if(bs==0){
sum+=2;
}else if(bs==1){
sum+=1;
}else if(bs==2){
sum+=2;
}
//cout<<"@"<<sum<<endl;
if(sum%2==0){
printf("0\n");
}else{
printf("1\n");
}
}else{
for(int i=0;i<a.length();i++){
int d=a[i]-'0';
as=((as%3)+(d%3))%3;
}
as=as%3;
for(int i=0;i<b.length();i++){
int d=b[i]-'0';
bs=((bs%3)+(d%3))%3;
}
bs=bs%3;
for(int i=as;i<=bs;i++){
if(i==1){
sum+=1;
}else if(i==2){
sum+=1;
}else if(i==0){
sum==0;
}
}
//cout<<"@"<<sum<<endl;
if(sum%2==0){
printf("0\n");
}else{
printf("1\n");
}
}
}
return 0;
}
H Singing Everywhere
就是先遍历一遍,看看有多少的破音点,然后遍历每一个低谷点,考虑把低谷点删除,看看对现在的破音点有什么影响。影响的话要分情况讨论,首先左右两个是不是都是峰点,然后低谷点删除了之后对左右两个峰点有什么影响,破音点是减少一个还是减少两个,还是不减少
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=1e5+10;
LL a[MAXN];
int main()
{
int t;
scanf("%d",&t);
while(t--){
LL n;
int flag1=0,flag2=0;
LL ans=0;
scanf("%lld",&n);
for(LL i=0;i<n;i++){
scanf("%lld",&a[i]);
}
for(LL i=1;i<(n-1);i++){
if(a[i]>a[i+1]&&a[i]>a[i-1]) ans++;
}
for(LL i=1;i<(n-1);i++){
int fe=0,fb=0;
if(a[i]<a[i+1]&&a[i]<a[i-1]){
if((i+2)<n){
if(a[i+1]>a[i]&&a[i+1]>a[i+2]){
if(a[i-1]<a[i+1]){
}else{
fe=1;
}
}
}
if((i-2)>=0){
if(a[i-1]>a[i-2]&&a[i-1]>a[i]){
if(a[i-1]>a[i+1]){
}else{
fb=1;
}
}
}
//cout<<fb<<" "<<fe<<endl;
if(fe||fb){
flag1=1;
}
if(fe&&fb){
flag2=1;
}
}
}
// cout<<"@"<<flag1<<" "<<flag2<<" "<<ans<<endl;
if(flag2){
ans-=2;
}else{
if(flag1){
ans-=1;
}
}
printf("%lld\n",ans);
}
return 0;
}
H Sequence in the Pocket
算是一个比较重视思路的题目吧,就是先考虑当前的有多少个已经排好序了,然后总个数减去已经排好序的个数,就是最小的移动次数(对于每一个未排好序的数,最少只要移动一次就行。就是在未排好序的所有数中先移动当前最大的数就行)
关于已排好序的:
什么叫已排好序的呢(和最后的序列比较,从结尾开始一样次序的最长长度)
比如 14325786 78是已经排好序的
14326876 中只有8是已经排好序的,不是68,因为最后坑定是6678,6和8中间还有一个7,68不算拍好序列的
# include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
int a[MAXN];
int aa[MAXN];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
aa[i]=a[i];
}
sort(aa,aa+n);
int l=(n-1);
for(int i=(n-1);i>=0;i--){
if(a[i]==aa[l]){
l--;
}
}
int c;
c=n-(n-1-l);
printf("%d\n",c);
}
return 0;
}
B Element Swapping
看着学长的代码看了一个小时。。。还没看懂。。。
分别对改过的,没改过的算一遍x,xx,y,yy,然后可以求出ak1+ak2
我也不知道我写清楚没,凑活着看吧。。。
然后对求出来的s1,s2分类;接着对a1a2进行分类;具体的看代码吧,(我也不知道能不能讲清楚,有点绕)
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=1e5+10;
LL b[MAXN];
int main()
{
int t;
scanf("%d",&t);
while(t--){
LL n,x,y;
LL xx=0,yy=0;
scanf("%lld %lld %lld",&n,&x,&y);
for(int i=1;i<=n;i++){
scanf("%lld",&b[i]);
xx+=(i*b[i]);
yy+=(i*b[i]*b[i]);
}
LL s1=x-xx,s2=y-yy;
map<LL,LL> ma;
if(s1==0&&s2==0){//考虑是否另个都为0,如果是,那么交换的两个就是一样的数字
LL ans=0;
for(int i=1;i<=n;i++){
ans+=ma[b[i]];
ma[b[i]]++;
}
printf("%lld\n",ans);
}else if(s1==0||s2==0){//考虑是否有一个为0,如果是那么就不正确
printf("0\n");
}else if(s2%s1!=0){//考虑是否能够整除,如果是,那么也不正确
printf("0\n");
}else{//可以进行计算的情况
LL a1,k1,a2,k2,a1a2,dd;
LL sum=0,c=s2/s1;
for(LL i=1;i<=n;i++){//当前的i是变化后的
a1=b[i];//因为是以b[i]数组作为考量的,所以当前是变化后的k1,就是变化前的k2
a2=c-a1;
a1a2=a1-a2;
if(a1a2==0){//考虑两个数是否一样,如果一样,那么改情况上诉已经考虑过,这时候就不正确
continue;
}
if(s1%(a1-a2)!=0){//考虑是否能够整除的情况,如果不是那么就不正确
continue;
}
dd=s1/a1a2;
if((dd+i)>n||(dd+i)<1){//考虑是否超出范围的情况,如果是那么不正确
continue;
}
if((a1-a2)!=(b[i]-b[dd+i])){//验证是否一样,k1、k2是否符合
continue;
}
sum++;
}
printf("%lld\n",sum/2);
}
}
return 0;
}