炒冷饭——五个月前的新生赛

本文深入探讨了ACM竞赛中的编程技巧,包括字符串处理、排序算法、动态规划、数学运算等关键知识点,通过具体题目的解析,分享了解题思路和代码实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值