寒假训练一周总结

这一周开始参加学校的冬训,参加了几次比赛,有解出来的,也有一点头绪都没有的,经过这几次训练,我深深的感觉到自己的实力还有很大的不足,还有很多的知识没有学,希望我能认真学习这些知识(djstl,图等)
以下是我的参加的一些题目(有些题目没有展示出来,因为我还没有学会,学了之后补题再发),本篇主要是回顾做题的心路历程和解题思路。

  1. 训练赛1
  • P1
    没有太多好说的,我就把小写字母转化成大写就过了

    代码如下
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main ()
{
	char str[1000];
	scanf("%s",str);
	for(int i=0;str[i]!=0;i++)
	{
		if(str[i]>='a'&&str[i]<='z')
		{
			str[i]-=32;
		}
	}
	printf("%s",str);
  • P2

    这道题我的思路就是找chuanzhi有多少个,也不难
    代码如下
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main ()
{
	int count=0;
	char str[400001];
	scanf("%s",str);
	for(int i=0;str[i]!=0;i++)
	{
		if(str[i]=='c'&&str[i+1]=='h'&&str[i+2]=='u'&&str[i+3]=='a'
			&&str[i+4]=='n'&&str[i+5]=='z'
			&&str[i+6]=='h'&&str[i+7]=='i')
		{
		    count++;
		}
		
	}
	printf("%d",count);
	
}
  • p3

    这道题对我来说就比上面两道题难上许多,并不是知识点不够不会写,而是考虑的事情太多,可以思考一下这道题。
    我一开始写的时候注意到闰年平年的问题就
  • P4

    这道题我没拿到100,只是90,我想应该是我的方法有问题,导致有一个点超时。
    我的思路是通过观察题目可知需要找到两个值,且满足第一个数/第二个数的值一定就行,所以我自然而然就想到了二分法。
    题目没有多难,可能是我方法问题,没有拿下100.
    代码如下
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a1[10000001],a2[100000001];
ll n;
ll max,min,mid;
int check(int mid)
{
	int s=0;
	for(int i=1;i<=n;i++)
	{
		int ans =a1[i]/mid;
		if(ans==a2[i])
			s++;
		else if(ans>a2[i])
			return -2;
		else
			return -3;
	}
	if(s==n)
		return 1;
	else
		return 0;
}
void find(int mid)
{
	int ans1,ans2;
	 int max =mid;
	 int min =mid;
	while(( ans1=check(max))!=0){
		if(ans1==1)
			max++;
		else
		{
			max--;
			break;
		}	
	}
	while((ans2 = check(min))!=0){
		if(ans2==1)
			min--;
		else
		{
			min++;
			break;
		}	
	}
	cout<<min<<" "<<max;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a1[i]>>a2[i];
	}
	ll l=0;
	ll r=9999999999;
	while(l<r)
	{
		mid=(l+r)/2;
		int res =check(mid);
		if(res==1)
		{
			find(mid);
			return 0;
		}else if(res==-2)
			l=mid+1;
		else if(res==-3)
			r=mid-1;
	}
}
  • P5

    这道题也没有太多好说的,就是单纯的数学问题,假如有n个,3个又可以换一个,那么多出来的数量就是n/3,
    这时n的数量发生变化,变为原来的n/3个再加上不够三个剩下来的数量
    代码如下\
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main ()
{
	int ans;
	int n;
	cin>>n;
	ans=n;
	while(n>2)
	{
		ans+=n/3;
		n=(n/3)+(n%3);
	}
	cout<<ans;
	return 0;
}

P6

这道题我的思路一开始两个嵌套循环,把所有的小于蛋糕宽或长里面的n全部算出来,然后累加,最后锁定最大那个数,代码如下

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll res[100001];
	int n,m;
ll ans;
void ef(int x,int y)
{ 
    for(int i=1;i<=min(x,y);i++)
	{
		res[i]+=(x/i)*(y/i);
	}
}
void pd()
{
	int max=1;
	for(int i=1;i<=m;i++){
	   if(res[i]>=m)
	   {
		   ans=i;
	   }
	}
	cout<<ans;
}
int main ()
{

	int a,b;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
	      cin>>a>>b;
	     ef(a,b);
	}
	pd();
}
不出意外,最后两个点rel了,然后换了一种思路,把每个n求出来算,用二分就可以解决
代码如下,
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
ll ans;
 struct Node
{
	int x;
	int y;
}a[100001];
bool ef(int x)
{ 
	int res=0;
   for(int i=1;i<=n;i++)
   {
	   res+=(a[i].x/x)*(a[i].y/x);
	if(res>=m)
		return true;
   }
	  
		return false;
}
int pd(int l,int r)
{
	while(l<r){
	int mid =(l+r+1)>>1;
		if(ef(mid))
	     l =mid;
		else 
			r=mid-1;
	}
	return l;
	}

int main ()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y;
	}
	 cout<<pd(1,1000002);
  return 0;
}

P7

这道题也不难就是基础的排序问题,你只需要找到从小到大不一样的数,然后冒泡排序的次数就是答案,代码如下

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[100000],b[100000];

int main ()
{
	int ans =0;
	int n;
	int swap;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[i]=i;
	}
		for(int i=1;i<=n;i++){
		if(a[i]!=b[i])
		{
			for(int j=i+1;j<=n;j++)
			{
				if(a[j]==b[i])
				{
					swap=a[i];
				    a[i]=a[j];
				    a[j]=swap;
					ans++;
				}
			}
		}
	}
	cout<<ans;
}
  1. 训练赛2
  • P1
posted @ 2024-01-28 00:18  冬天的睡袋  阅读(16)  评论(0编辑  收藏  举报