通师高专科技创新社周赛Round 15

CF10A Power Consumption Calculation

题目链接

题意

给你该人碰电脑的区间,问电脑的总的耗能是多少

思路

1.分情况 是一个区间还是多个区间

2. 多个区间时,除了第一个区间其余的区间的状态的时间对应的耗能

3.最后所有的耗能进行相加

坑点

代码

#include<bits/stdc++.h>
using namespace std;
int n,p1,p2,p3,t1,t2;
int l,r,s;
int ans=0;
int main()
{
	cin>>n>>p1>>p2>>p3>>t1>>t2;
	for(int i=1;i<=n;i++)
	{
		cin>>l>>r;
		if(i>l)//忽略第一个区间 
		{
			ans=ans+min(t1,l-s)*p1;//活跃状态的消耗 
			if(l-s> t1)//差 大于 t1 时 
			{
				ans=ans+min(l-s-t1,t2)*p2;//休息状态的消耗 
				if(l-s>t1+t2)// 转成睡眠状态 
				{
					ans=ans+(l-s-t1-t2)*p3;// 睡眠状态的消耗
				}
			}
		}
		ans=ans+(r-l)*p1;//第一个区间的消耗 
		s=r; //将 r 赋给 s ,更新 
	}
	cout<<ans;
	return 0;
} 

总结

难度简单,理清题意,进行模拟即可

 

CF894A QAQ

题目链接

题意

给你一个字符串,让你找其中包含QAQ的个数,QAQ可以不连续但是要按顺序

思路

1.根据字符串结果推公式

2.利用公式,累加

3.输出结果

坑点

代码

#include<bits/stdc++.h>
char a[105];
int main()
{
    int n,Q=0,q=0,sum=0;
    scanf("%s",a);
    n=strlen(a);
    for(int i=0;i<n;i++)//计数里面有多少个Q
    {
        if(a[i]=='Q')
        Q++;
    }
    for(int i=0;i<n;i++)//q为在A的前面有多少个Q,q*(Q-q)为有多少个QAQ
    {
        if(a[i]=='Q')
        {
        	q++;
		}  
        if(a[i]=='A')
        {
        	sum+=(q*(Q-q));
		}
    }
    printf("%d",sum);
    return 0;
}

总结

难度简单,简单模拟求和即可

 CF659D Bicycle Race

题目链接

题意

给你一个人盐湖骑车的坐标,让你判断有几个点不转换方向就会掉进湖里

思路

1.找出需要转弯的角的特殊情况

2.分析 求出 数量

坑点

输入中,比角的数量多一,最后要回归起点

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,x,y;
	cin>>n;
	for(int i=0;i<=n;i++)
	{
		x=0,y=0;
		cin>>x>>y;
	}
	cout<<(n-4)/2;
	return 0;
}
//由题意知,遇到 270 的角要转弯 ,转弯几次 即 有几个这样的角 
// 多边形内角和公式  角 = 180 *(n-2)
// 假设有 x 个这样的角 , 共 n 个角 
// 则 90 *( n - x )+ 270 * x =180 *(n-2)
// 得 x = ( n - 4 )/ 2 

总结

难度稍难,多边形的内角和公式较难想到,利用内角和公式求解即可

CF445A DZY Loves Chessboard

题目链接

题意

一个棋盘n行m列,给你棋盘上的各个符号表示,问怎样放置颜色可以使相邻的颜色的各不相同

思路

1.根据样例的结果进行模拟,

2.根据点的奇偶性判断颜色的选择

3.遍历输出颜色

坑点

代码

#include<bits/stdc++.h>
int n, m;
char s[105][105];
int main()
{
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++)
	{
		scanf("%s", s[i]+1);
	}
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
		{
			if(s[i][j] == '.')
			{
				if((j%2) == (i%2)) printf("B");//找规律可知,如果两个字同奇偶性,就是黑
				else printf("W");//否则就是白
			} 
			else printf("-");//坏掉原样输出;
		}
		printf("\n");
	}
	return 0;
}
#include <iostream>
#include <cstdio>
using namespace std;
char s[105][105];
int n, m;
int dir[4][2] = { {1, 0}, {0, 1}, {0, -1}, {-1, 0} };
void dfs(int x, int y, char c)
{
	s[x][y] = c;
	for (int i = 0; i < 4; i++)
	{
		int tx = x + dir[i][0];
		int ty = y + dir[i][1];
		if (tx < 0 || tx >= n || ty < 0 || ty >= m)
		{
			continue;
		}
		if (s[tx][ty] == '.')
		{
			//当前4个方向是相邻的,不能同时为B或者W 
			if (c == 'B')
			{
				dfs(tx, ty, 'W');
			}
			else
			{
				dfs(tx, ty, 'B');
			}
		}
	}
}
int main()
{
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> s[i][j];
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (s[i][j] == '.')
			{//只要是‘.’就搜索四个方向是否还存在‘.’
				dfs(i, j, 'B');
			}
		}
	}
	
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{

			cout << s[i][j];
		}
		cout << endl;
	}
	return 0;
}

总结

难度中等,找到规律,搜索

 CF1133C Balanced Team

题目链接

题意

给你n个数,让你找出其中最多能有几个数,满足这些数中的最大值和最小值相差不大于5

思路

1.根据样例推结果,得跟队列很像

2.利用队列进行模拟,判断是否满足最大值与最小值相差小于等于5,并更新队列大小

坑点

代码

#include <bits/stdc++.h>
#include <queue>
using namespace std;
int a[200020],cnt[200020];
queue<int> q;
int main()
{
    int n;
    cin >> n;//共 n 个数  
    for(int i = 1; i <= n; i++)
    {
    	cin >> a[i];//各个数 
	}
    sort(a+1,a+1+n);//从小到大排序 
    int j = 0;//用于遍历 
    q.push(a[1]); //能力最小的队员入队列了
    cnt[j] = q.size(); //记录 队列中有多少个  
    int maxn = q.front()+5; //他能组的队友能力的极限
    for(int i = 2; i <= n; i++)//从第二个开始遍历
    {
        if(a[i] <= maxn)//符合要求进入队列
        {
            q.push(a[i]);
            cnt[j] = q.size();
            continue;
        }
        else//不符合要求,把队首拿出,然后依次判断下面的队员
        {
            cnt[j++] = q.size();
            q.pop();
            while(!q.empty())
            {
                maxn = q.front()+5;
                if(a[i]>maxn)
                {
                    cnt[j++] = q.size();//更新大小 
                    q.pop();//弹出队首 
                }
                else
                {
                    q.push(a[i]);
                    maxn = q.front()+5;
                    break;
                }
            }
            if(q.empty())//队列被拿空了,只能自己进去了
            {
                q.push(a[i]);
                maxn = q.front()+5;
            }
        }
    }
    int k = 0;//最大的长度  
    for(int i = 0; i <= j; i++)
	{
		k = max(k,cnt[i]);
	} 
    cout << k << endl;
    return 0;
}

总结

难度中等,需要判断的情况较多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值