前面几次上机打的也很差,在写题时思路还是不够缜密,很多时候思路对了但要花很多时间去调试程序。
第一个签到题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范围内的