A题(No)
可能 是题读错了吧
口吐芬芳
就是首尾看相同的最大长度
我就是不服这个题能读错?o??
注意一下substr的使用
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
using namespace std;
//想骂娘
//我一直以为输入4 5 aaaa 答案应该是aaaaa
//我丢了呜呜呜呜呜
int main(){
int a,b,i,j,p=0,t=0;
string s,ans;
cin>>a>>b;
cin>>s;
for(i=a-1;i>=1;i--){//枚举长度
if(s.substr(0,i)==s.substr(a-i,i)){
ans=s.substr(i,a-i+1);
t=1;
break;
}
}
if(t){
cout<<s.substr(0,i);
while(b--)
cout<<ans;
}
else{
while(b--)
cout<<s;
}
return 0;
}
B题(NO)
我以为我现在都够菜了,没想到5个月前更菜
分两种情况
1.奇偶个数相差小于等于1,可以都剪完
2.否则,排序后,把多的剪了
3.前排提醒,如果在做题时考虑的情况太多,多半就是方法没选对
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
using namespace std;
//想骂娘
//我一直以为输入4 5 aaaa 答案应该是aaaaa
//我丢了呜呜呜呜呜
int ou[2006],ji[2006];
int main(){
int a,p=0,q=0,b,sum=0;
cin>>a;
while(a--){
cin>>b;
if(b%2==0)
ou[++p]=b;
else
ji[++q]=b;
}
sort(ou+1,ou+p+1);
sort(ji+1,ji+q+1);
if(abs(p-q)<=0){
cout<<"0";
return 0;
}
else
{
if(p>q)
for(int i=1;i<=p-q-1;i++)
sum+=ou[i];
else
for(int i=1;i<=q-p-1;i++)
sum+=ji[i];
}
cout<<sum;
return 0;
}
C题(NO)
还是不会
这种思维题真的好秀啊
最重要的就是删除时后面不会影响前面的,
所以遍历时前面一有重复就应该直接删除,
我还一直在纠结怎样才能实现最少步骤,666
注意最后长度是奇数时本着后面不影响前面,就可以直接把最后一个删掉
妙啊!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
const ll c=100000007;
//还是不会,看的题解,思路牛皮啊
/*遍历,因为后面的变动不会影响前面的
所以前面有问题应该直接删除*/
char ans[200006];
char s[200006];
int main(){
int a,i,k=0;
cin>>a;
cin>>s+1;
for(i=1;i<=a;i++){
ans[++k]=s[i];
if(k%2==1){
while(i+1<=a&&s[i+1]==s[i]){
i++;
}
}
}
cout<<a-k/2*2<<endl;
for(i=1;i<=k/2*2;i++)cout<<ans[i];
return 0;
}
D题(YES)
就很无脑了
无论那条路路径都是一样的
#include<stdio.h>
int main()
{
long long a,b;
scanf("%lld%lld",&a,&b);
printf("%lld",a+b);
return 0;
}
F题(YES)
也无脑,直接找就可以了
代码懒得改了
#include<stdio.h>
int main()
{
char c[101][101],x[101][101];
int a,b,i,j,sum=0;
scanf("%d%d%*c",&a,&b);
for(i=0;i<a;i++)
{
for(j=0;j<b;j++)
scanf("%c",&c[i][j]);
getchar();
}
for(i=0;i<a;i++)
for(j=0;j<b;j++)
{
if(c[i][j]!='*')
{
sum=0;
if(c[i+1][j]=='*'&&i+1<a)
sum++;
if(c[i-1][j]=='*'&&i-1>=0)
sum++;
if(c[i][j+1]=='*'&&j+1<b)
sum++;
if(c[i][j-1]=='*'&&j-1>=0)
sum++;
if(c[i-1][j-1]=='*'&&i-1>=0&&j-1>=0)
sum++;
if(c[i-1][j+1]=='*'&&i-1>=0&&j+1<b)
sum++;
if(c[i+1][j-1]=='*'&&i+1<a&&j-1>=0)
sum++;
if(c[i+1][j+1]=='*'&&i+1<a&&j+1<b)
sum++;
x[i][j]=sum+48;
}
else
x[i][j]='*';
}
for(i=0;i<a;i++)
{
for(j=0;j<b;j++)
printf("%c",x[i][j]);
printf("\n");
}
return 0;
}
G题(NO)
水
把公式整理出来,然后一个快速幂取余就好了
注意一些地方取余,不晓得就一股脑全部取,还要记得负数怎样取余
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
const ll c=100000007;
ll kuai(ll a,ll b){
ll ans=1;
a=a%c;
while(b){
if(b&1)
ans=(ans*a)%c;
a=a*a%c;
b>>=1;
}
return ans;
}
int main(){
int a;
ll m,n;
cin>>a;
while(a--){
cin>>n>>m;
cout<<(kuai(m,n)%c-m%c*kuai(m-1,n-1)%c+c)%c<<endl;
}
return 0;
}
I题(NO)
就是个前缀和
题目里的两种情况
水的一批
1.开始标志ans[1]++,结束ans[n+1]–;
2.开始标志ans[n]++,不用结束;
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
//const ll c=100000007;
//还是不会,看的题解,思路牛皮啊
/*遍历,因为后面的变动不会影响前面的
所以前面有问题应该直接删除*/
int c[1000006];
int main(){
int a,e,f,g,h,p,q;
scanf("%d",&a);
while(a--){
memset(c,0,sizeof(c));
scanf("%d%d",&e,&f);
while(f--){
scanf("%d%d",&g,&h);
if(g==1){
c[h+1]--;
c[1]++;
}
else
c[h]++;
}
for(int i=2;i<=e;i++)c[i]+=c[i-1];
scanf("%d",&p);
while(p--){
scanf("%d",&q);
printf("%d\n",h[d]);
}
}
return 0;
} ```
## K题(YES)
> 要是有这样的题我能笑醒
```cpp
#include<stdio.h>
int main()
{
int a,i,b,o=0,j=0;
scanf("%d",&a);
for(i=1;i<=a;i++)
{
scanf("%d",&b);
if(i%2==0)
o=o+b;
else
j=j+b;
}
printf("%d %d",o,j);
return 0;
}