一、稀疏向量
题目描述
输入格式
输出格式
样例输入
样例输出
-20
样例解释
子任务
代码描述
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n,a,b;
cin>>n>>a>>b;
vector< pair<int,int> > u,v; //使用vector容器来存储数据
int index,value;
//输入两个稀疏向量的index与value
for(int i=0;i<a;i++)
{
cin>>index>>value;
u.push_back({index, value});
}
for(int i=0;i<b;i++)
{
cin>>index>>value;
v.push_back({index, value});
}
int i=0,j=0;
long long int res=0;
while(i<a&&j<b)
{
//.first表示了向量的index,.second表示了向量的value
if(u[i].first==v[j].first)
{
//当两向量的index相等时就相乘并求和
res+=u[i].second*u[j].second;
i++;j++;
}
//两向量的index不等时就移动指针
else if(u[i].first<v[j].first)
i++;
else
j++;
}
cout<<res;
return 0;
}
二、题目描述
输入格式
输出格式
样例输入
样例输出
样例解释
子任务
代码描述
#include <iostream>
#include <stack>
using namespace std;
//定义一个取相反数的函数
int reverse(int m)
{
return (0-m);
}
int main()
{
stack<int> num; //声明一个int型的栈变量
string s;
int n;
cin>>n;
while(n--)
{
cin>>s;
for(int i=0;i<7;i++)
{
//当字符是数字时直接进栈
if(s[i]>='0'&&s[i]<='9')
{
num.push(s[i]-'0');
}
//当字符是x或者/时,定义栈顶元素出栈后完成乘除操作
else if(s[i]=='x'||s[i]=='/')
{
int temp=num.top();
num.pop();
if(s[i]=='x')
{
temp *= (s[++i]-'0');
//这里使用++i而不是i++,因为i++在这条语句执行前没有完成+1操作,而这里需要的是完成了+1操作的数据,因此就是++i
}
else if(s[i]=='/')
{
temp /= (s[++i]-'0');
}
num.push(temp); //将得出的结果进栈
}
else if(s[i]=='+'||s[i]=='-')
{
//如果是+或者-则直接进行进栈操作
if(s[i]=='+')
{
num.push(s[++i]-'0');
}
else if(s[i]=='-')
{
//注意:减号直接将数字的相反数进栈即可
num.push(reverse(s[++i]-'0'));
}
}
}
int res=0;
//当栈不为空时,一直进行计算,知道最后出栈
while(!num.empty())
{
int temp=num.top();
res +=temp;
num.pop();
}
if(res==24)
{
cout<<"Yes"<<endl;
}
else if(res!=24)
{
cout<<"No"<<endl;
}
}
return 0;
}
三、题目描述
输入格式
输出格式
样例输入
样例输出
样例解释
子任务
代码描述
#include <iostream>
using namespace std;
typedef struct
{
int x,y;
int flag; //垃圾站标记,0表示不是垃圾站
}GarbagePoint; //垃圾类型
GarbagePoint gp[1005]; //垃圾点
//第一个函数用来判断这个点是否是垃圾站
void isGarbagePoint(GarbagePoint gp[],int n)
{
for(int i=0;i<n;i++)
{
int sum=0; //垃圾站个数
for(int j=0;j<n;j++)
{
//上下左右都有垃圾
if((gp[i].x==gp[j].x&&gp[i].y+1==gp[j].y)||
(gp[i].x==gp[j].x&&gp[i].y-1==gp[j].y)||
(gp[i].x+1==gp[j].x&&gp[i].y==gp[j].y)||
(gp[i].x-1==gp[j].x&&gp[i].y==gp[j].y))
sum++;
}
//四个点都有垃圾,就将flag赋值为1
if(sum==4)
gp[i].flag=1;
}
}
//第二个函数用来判断这个点的得分
void GetScore(GarbagePoint gp[],int n,int score[])
{
for(int i=0;i<n;i++)
{
int sum=0;
if(gp[i].flag==1)
{
for(int j=0;j<n;j++)
{
//确定垃圾点左上左下右上右下是否有垃圾
if((gp[i].x+1==gp[j].x&&gp[i].y+1==gp[j].y)||
(gp[i].x-1==gp[j].x&&gp[i].y-1==gp[j].y)||
(gp[i].x+1==gp[j].x&&gp[i].y-1==gp[j].y)||
(gp[i].x-1==gp[j].x&&gp[i].y+1==gp[j].y))
sum++;
}
if(sum==0)
score[0]++;
else if(sum==1)
score[1]++;
else if(sum==2)
score[2]++;
else if(sum==3)
score[3]++;
else if(sum==4)
score[4]++;
}
}
}
int main()
{
int n;
int score[5]={0};
cin>>n;
for(int i=0;i<n;i++)
{
cin>>gp[i].x>>gp[i].y;;
}
isGarbagePoint(gp,n);
GetScore(gp,n,score);
for(int i=0;i<5;i++)
cout<<score[i]<<endl;
return 0;
}
四、题目描述
输入格式
输出格式
样例输入
样例输出
222 1 0
样例解释
子任务
#include <iostream>
using namespace std;
int T=0, D=0, E=0;//剩下苹果总数,发生苹果掉落的苹果树棵数,相邻连续三棵树发生苹果掉落情况的棵数
int apple[1005], drop[1005] ,sum;//apple[]表示每次疏果数,drop[]用于记录每棵树是否有掉落,sum计算一棵树的剩余果数
int main()
{
int n,m;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> m;//接受第i棵树的操作轮数
for (int j = 1; j <= m; j++)
{
cin >> apple[j];//接收当前苹果个数或第j轮的疏果数
if (apple[j] > 0)
{
//判断是否有苹果掉落
if (apple[j] < sum)
{
//如果有掉落则drop数组中该苹果树代表的位置变为1,表示有掉落
drop[i] = 1;
}
sum = apple[j];
}
//没有掉落 则继续计算苹果数
else
{
sum += apple[j];//计算前j轮操作后苹果数
}
}
T = T + p;//计算剩余苹果数
sum = 0;//重置sum
}
for (int i = 1; i <= n; i++)
{
if (drop[i])
D++;
}
//前N-2棵树的相邻情况
for (int i = 1; i <= n-2; i++)
{
if (drop[i] && drop[i + 1] && drop[i + 2])
E++;
}
//倒数第二棵+倒数第一棵+第一棵
if (drop[n - 1] && drop[n] && drop[1])
E++;
//倒数第一棵+第一棵+第二棵
if (drop[n] && drop[1] && drop[2])
E++;
cout << T << ' ' << D << ' ' << E << ' ' << endl;//输出数据
return 0;
}