#include<stdio.h> #include<string.h> char ch[103],str[103]; int main() { int n,max,a,b,i,d,m; while(~scanf("%d",&n)) { max=0; for(i=0;i<n;i++) { scanf("%s%d%d",str,&a,&b); if(b<200) // 体积少于200的,直接忽略 continue; d=(b/200)*200; if(d>1000) // 体积大于1000的,按1000算 d=1000; if(max<d/a) { max=d/a; strcpy(ch,str); m=b; } if(max==(d/a)&&m<b) // 如果价格都最便宜,则选择体积大的 { strcpy(ch,str); m=b; } } printf("%s\n",ch); } return 0; }
时间: 2024-03-28 09:39:31 浏览: 57
这段代码是一个简单的模拟题目的解法,输入有多组数据,每组数据包含 n 个物品,每个物品有名称、价格和体积三个属性。要求找到价格体积比最优的物品,并输出其名称。其中体积小于 200 的物品直接忽略,体积大于 1000 的物品按 1000 计算。
代码中用 max 记录当前最优值,用 ch 和 m 记录最优物品的名称和体积。如果有多个物品价格体积比相同,则选择体积大的。
这段代码的时间复杂度为 O(n),对于数据规模较小的情况下能够很好地解决问题。
相关问题
#include<stdio.h> #include<string.h> void main() { char str[10]="Ch\nina"; printf("%d",strlen(str)); }
这段代码的作用是输出字符串 "Ch\nina" 的长度,即 6。但是可以看出,在数组定义时,只分配了 10 个字符的空间,而 "Ch\nina" 长度为 7,因此存在字符串溢出的问题。建议将数组大小定义为至少 8 个字符。同时,main 函数的返回值应该为 int 而不是 void。修改后的代码如下所示:
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[8] = "Ch\nina";
printf("%d", strlen(str));
return 0;
}
```
#include<stdio.h> #include<string.h> int fun(char *s) { char *s1=s; for(;s1<s+strlen(s);s1++) if(*s>='0'&&*s<='9') strcpy(str,str+1); } int main() { char ch[100]; int i; gets(ch); puts(ch); return 0; }
这段代码存在一些问题:
1. 函数 `fun` 中定义了一个指针 `s1` 并赋值为 `s`,但在循环内并没有使用该指针进行操作,应该改为 `if (*s1 >= '0' && *s1 <= '9') strcpy(s1, s1+1);`
2. 函数 `fun` 中使用了一个未定义的变量 `str`,应该先定义再使用。
3. 函数 `fun` 没有返回值,应该改为 `void fun(char *s)`。
4. 函数 `main` 中使用了一个未定义的变量 `i`,应该先定义再使用。
5. 函数 `gets` 不安全,容易导致缓冲区溢出,建议使用更安全的函数 `fgets`。
6. 函数 `puts` 输出的是字符串,应该加上双引号。
修改后的代码如下:
```c
#include <stdio.h>
#include <string.h>
void fun(char *s) {
char *s1 = s;
for (; s1 < s + strlen(s); s1++) {
if (*s1 >= '0' && *s1 <= '9') {
strcpy(s1, s1+1);
s1--; // 因为删除了一个字符,指针需要回退一位
}
}
}
int main() {
char ch[100];
fgets(ch, 100, stdin);
puts(ch);
fun(ch);
printf("%s\n", ch);
return 0;
}
```
阅读全文