0%

CF106b题解

比较水的题了,但我又被淹死了

思路

大体分三步:

  1. 电脑数量 $n$ 的范围较小 $(n<100)$,所以直接双重循环一遍过即可,由于题意也就比较简洁,所以不需要进行别的处理。

  2. 双重循环判断每台电脑是否过时,这里注意过时的条件是每个参数同时小于一台电脑,而不是小于最大值。

  3. 可以用一个变量同时维护是否过时和下标(详见代码)。

代码

重点在于结构体的运用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
#define N 105
using namespace std;
struct Node{
int s;//速度
int r;//内存
int h;//硬盘
int v;//花费
int ok;//维护是否过时和下标
}f[N];
int m;
void check(){//判断是否过时
for(int i=0;i<m-1;i++){//枚举出两个电脑
for(int j=i+1;j<m;j++){
if(f[i].s<=f[j].s&&f[i].r<=f[j].r&&f[i].h<=f[j].h)
f[i].ok=-1;//用-1标记过时
if(f[j].s<=f[i].s&&f[j].r<=f[i].r&&f[j].h<=f[i].h)
f[j].ok=-1;
}
}
}
int main(){
cin>>m;
for(int i=0;i<m;i++){
cin>>f[i].s>>f[i].r>>f[i].h>>f[i].v;
f[i].ok=i+1;//储存下标
}
check();
Node minn;//循环求最小值
minn.v=10000;
for(int i=0;i<m;i++){//枚举出两个电脑
if(f[i].ok!=-1&&f[i].v<minn.v)minn=f[i];
else continue;
}
cout<<minn.ok;//输出最小值
}

完结撒花,这题难度也不是很高,建议评红或橙。