2021吉首大学杯总结

前面几次上机打的也很差,在写题时思路还是不够缜密,很多时候思路对了但要花很多时间去调试程序。

第一个签到题a了好久

 是对非负数和负数分个类再排个序,位置用个标记数组存着,做的时候没看清题目把零当特殊位置了

 这个绝对的签到题卡了我n遍,其实我查了那天的农历还是错的,我不理解,因为之前做过类似的题以为输出有坑,最后还是管理员改了题面才对的

 一个输出签到题,第一行输出n个7,n-1行输出n-1个空格在输出一个7

 大数乘法,比大数加法简单,注意每一次的进位

#include <iostream>
using namespace std;
const int max_n=1e6+10;
char a[max_n];
int main()
{
    int n;
    int z;
    cin  >> n;
    cin   >> a;
    int s,s1;
    z=n-11;
    s=s1=0;
    for(int i=0;i<=z;i++)
        {
            if(a[i]!='2')s++;
            else s1++;
        }
     if(s<s1)cout <<"yyds"<<endl;
     else   cout <<"orz"<<endl; 
}

这个题交了好多次一直wrong answer88%,是我想复杂了,只要考虑前面总次数减去11有多少个2,如果2的个数少于等于删除次数那么必输;

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char a[10000];
   int t;
   cin >> t;
    int s,s1;
    while(t--)
   { 
      cin >> a;
        s=s1=0;
    if(a[0]=='a'&&a[1]=='b')s++;
    if(a[0]=='b'&&a[1]=='a')s1++;
    if(a[strlen(a)-2]=='a'&&a[strlen(a)-1]=='b')s++;
    if(a[strlen(a)-2]=='b'&&a[strlen(a)-1]=='a')s1++;
    if(s==s1){
        cout << 0<< endl;
        cout << a << endl;
    }
    else {
        cout << 1<< endl;
        if(a[0]=='a')a[0]='b';
        else a[0]='a';
        cout << a << endl;
    }
   }
}

这个题看的时候都没有什么思路,最后看了学长给的题解才明白中间只要ab+1ba绝对也会+1,只要考虑开端和末端ab==ba就可以了

 这个题一开始找规律只考虑了10,而没想到1可以带无数个0,那这就是对0进行组合排列再乘以1的个数

#include <iostream>
#include <string.h>
using namespace std;
const int max_n=10e6+1;
char a[max_n];
int b[max_n];
long long fun(int c[],int n)
{
    long long ans=0;
    long long base=1;
  for(int i=n-1;i>=1;i--)
  {ans=(ans*2+c[i])%1000000007;
  }
  return ans;
}
int main()
{
   while( cin >> a)
    {
        memset(b,0,sizeof(b));
        int cnt=1;
    for(int i=strlen(a)-1;i>=0;i--)
       {
           int temp=a[i]-'0';
           if(temp%2==cnt%2)b[cnt++]=1;
           else b[cnt++]=0;

       }
       long long ans;
       ans=fun(b,cnt);
       cout << ans << endl;

    }
    
}

 这个题挺简单的,刷题时竟然看下题面觉得自己做不出,这种进制转换且超范围求余最好从高位开始转换,下机后做这个题在处理大数求余出了问题

 唯一一个只交了一遍就过的的题,先把银行的七进制转成十进制,相加后,再转成七进制

 

#include <iostream>
using namespace std;
const int max_n = 1e5 + 10;
long long int a[max_n];
long long int b[max_n];
int main()
{
    a[1] = 1;
    a[2] = 0;
    b[1] = b[2] = 1;
    for (int i = 3; i < max_n; i++)
       {
            b[i] = b[i - 1] + b[i - 2] ;b[i]%= 1000000007;
       }
    for (int i = 3; i < max_n; i++)
        {
            a[i] = (a[i - 1] + b[i - 2]);a[i] %= 1000000007;
        }
    int t;
    cin >> t;
    cout << a[t];
}

看了学长的题解没看懂,最后问了卷王才明白,加的是兔子数列,是当前数列加的兔子数列,之前也遇到过找规律是兔子数列,感觉这种比赛都在找规律

#include <iostream>
using namespace std;
const int max_n=101;
int b[max_n];
void fun(int x)
{
    int s=x;
   
        if(x>=10)
        if(s%10%3==0||s%3==0||s/10%3==0){b[x]=b[x-1]+1;}
        else{
            b[x]=b[x-1];
        }
        if(x<10)
        if(s%3==0){b[x]=b[x-1]+1;}
        else {
            b[x]=b[x-1];
        }
        

    

}
int main()
{
   for(int i=1;i<100;i++)
   {
    fun(i);
   }
   b[100]+=b[99]+1;
  
   int t;
   cin >> t;
   while(t--)
   {
        long long int n,m;
       cin >> n>>m;
    long long  int ans;
     if(m>100&&n>100)ans=m-n+1;
     else if(n<100&&m<100) ans=b[m]-b[n-1];
    else   ans=m-100+b[99]-b[n-1]+1;
    cout << ans << endl;
     

   }
 

}

 此题有个规律是大于等于一百的数都是好数字,我们只需要对于小于一百进行暴力破解,用到前缀和的思想对前一百打表,所以分三种情况,整个区间都没包括1~99,和部分含有1~99部分>=100,和在1~99范围内的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值