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;
}
总结
难度中等,需要判断的情况较多