【15NOIP普及组】求和
提交数:4122 通过数: 1280
大概讲下这道题昂(源代码在最后)
这道题说实话对于我来说相当难读懂,我一开始还以为x,y,z是number,后面才读懂它指的是编号
题目说是两个条件,写程序的话,就是四个,分别是 x<y y<z y-x=z-y color[x]=color[z]
可以套三个for函数,变量就是x,y,z,用穷举法列举每一种可能,用这四个条件判断x,y,z。满足条件向ans里加就可以了。
但是为了时间复杂度,三个for函数就必须写的巧妙一些了
for(int z=1;z<=n;z++){
for(int y=1;y<=z;y++){
for(int x=1;x<=y;x++){
if(y-x==z-y&& color[x]==color[z]&&y>x){
ans+=(x+z)*(number[x]+number[z]);
}
}
}
}
我给每一个数的规定了上限,但是以我目前的水平上限和下限只能规定一个,如果你可以同时做到,就在评论区让我小刀拉屁股——开开眼。
如果是规定下限就要写成这样
for(int x=1;x<=n;x++){
for(int y=x;y<=n;y++){
for(int z=y;z<=n;z++){
if(y-x==z-y&& color[x]==color[z]&&y>x){
ans+=(x+z)*(number[x]+number[z]);
}
}
}
}
最后就是我的代码啦(其实上面的关键部分有了,这道题就不难了)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int number[n];
int color[n];
for(int i=1;i<=n;i++){
cin>>number[i];
}for(int i=1;i<=n;i++){
cin>>color[i];
}int ans=0;
for(int x=1;x<=n;x++){
for(int y=x;y<=n;y++){
for(int z=y;z<=n;z++){
if(y-x==z-y&& color[x]==color[z]&&y>x){
ans+=(x+z)*(number[x]+number[z]);
}
}
}
}cout<<ans%10007;
return 0;
}