#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 100005 #define inf 0x7fffffff int a1[4],a2[4],T; double mx1[MAXN],mx2[MAXN]; double min(double a,double b) { return a<b?a:b; } int main() { for(int i=1;i<=3;++i) scanf("%d",&a1[i]); for(int i=1;i<=3;++i) scanf("%d",&a2[i]); scanf("%d",&T); double l=0,r=inf; for(int TTT=1;TTT<=100;++TTT) //100次迭代,不同的题可能需要更多迭代次数 { double mid=(l+r)/2; for(int i=1;i<=3;++i) mx1[i]=a1[i]*mid,mx2[i]=a2[i]*mid; if(mx1[1]+mx2[1]>=200 && mx1[2]+mx2[2]>=300 && mx1[1]+mx2[1]+mx1[2]+mx2[2]<=T*1.0) //满足条件 { printf("%.0lf %.0lf %.0lf",mx1[1]+mx2[1],mx1[2]+mx2[2],mx1[3]+mx2[3]); break; } if(mx1[1]+mx2[1]<200 || mx1[2]+mx2[2]<300 || mx1[1]+mx2[1]+mx1[2]+mx2[2]>T*1.0) l=mid; else r=mid; } return 0; }优化上述代码
时间: 2024-04-06 19:34:40 浏览: 144
这段代码本身已经比较简洁,但可以考虑以下几点优化:
1. 使用变量保存常量
将 inf 和 100 这两个常量定义为变量,可以避免代码中的魔法数字,提高代码可读性。
2. 减少重复代码
将读入 a1 和 a2 数组的循环合并,可以减少重复代码。
3. 使用二分查找优化循环次数
由于题目要求找到最小的满足条件的值,可以使用二分查找来优化循环次数,避免不必要的计算。
4. 减少计算次数
将 mx1 和 mx2 的计算提出来,避免在循环中多次计算,提高效率。
优化后的代码如下:
相关问题
#include <stdio.h> #include <string.h> #include <stdlib.h> #define maxn 1000 char buf[maxn], str[maxn], signStack[maxn], ch[2]; int len, id, idSign, idAns, i, n; double ans[maxn]; void checkSign(char sign){ if(sign == '(') signStack[idSign++] =
sign;
else if(sign == ')'){
while(signStack[idSign-1] != '('){
char op = signStack[--idSign];
double b = ans[--idAns], a = ans[--idAns];
if(op == '+') ans[idAns++] = a + b;
else if(op == '-') ans[idAns++] = a - b;
else if(op == '*') ans[idAns++] = a * b;
else if(op == '/') ans[idAns++] = a / b;
}
idSign--;
}
else if(sign == '+' || sign == '-'){
while(idSign > 0 && signStack[idSign-1] != '('){
char op = signStack[--idSign];
double b = ans[--idAns], a = ans[--idAns];
if(op == '+') ans[idAns++] = a + b;
else if(op == '-') ans[idAns++] = a - b;
else if(op == '*') ans[idAns++] = a * b;
else if(op == '/') ans[idAns++] = a / b;
}
signStack[idSign++] = sign;
}
else if(sign == '*' || sign == '/'){
while(idSign > 0 && (signStack[idSign-1] == '*' || signStack[idSign-1] == '/')){
char op = signStack[--idSign];
double b = ans[--idAns], a = ans[--idAns];
if(op == '*') ans[idAns++] = a * b;
else if(op == '/') ans[idAns++] = a / b;
}
signStack[idSign++] = sign;
}
}
int main(){
while(fgets(buf, maxn, stdin) != NULL){
len = strlen(buf);
id = idSign = idAns = 0;
memset(ans, 0, sizeof(ans));
memset(signStack, 0, sizeof(signStack));
for(i = 0; i < len; i++){
if(buf[i] == ' ' || buf[i] == '\n') continue;
if(buf[i] >= '0' && buf[i] <= '9'){
n = 0;
while(buf[i] >= '0' && buf[i] <= '9'){
n = n * 10 + buf[i] - '0';
i++;
}
ans[idAns++] = (double)n;
i--;
}
else{
checkSign(buf[i]);
}
}
while(idSign > 0){
char op = signStack[--idSign];
double b = ans[--idAns], a = ans[--idAns];
if(op == '+') ans[idAns++] = a + b;
else if(op == '-') ans[idAns++] = a - b;
else if(op == '*') ans[idAns++] = a * b;
else if(op == '/') ans[idAns++] = a / b;
}
printf("%.2f\n", ans[0]);
}
return 0;
}
请问这段代码实现了什么功能?
本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。 函数接口定义: int max_len( char *s[], int n ); 其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。 裁判测试程序样例: #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 10 #define MAXS 20 int max_len( char *s[], int n ); int main() { int i, n; char *string[MAXN] = {NULL}; scanf("%d", &n); for(i = 0; i < n; i++) { string[i] = (char *)malloc(sizeof(char)*MAXS); scanf("%s", string[i]); } printf("%d\n", max_len(string, n)); return 0; }用c语言代码输出
下面是实现题目要求的 `max_len` 函数的 C 语言代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int max_len(char *s[], int n) {
int max = 0;
for (int i = 0; i < n; i++) {
int len = strlen(s[i]);
if (len > max) {
max = len;
}
}
return max;
}
int main() {
int n;
scanf("%d", &n);
char *string[n];
for (int i = 0; i < n; i++) {
string[i] = (char *)malloc(sizeof(char) * MAX_LEN);
scanf("%s", string[i]);
}
printf("%d\n", max_len(string, n));
return 0;
}
```
在 `max_len` 函数中,我们遍历了指针数组 `s` 中的所有字符串,计算每个字符串的长度,并与当前最大长度进行比较,最终返回最长字符串的长度。
在 `main` 函数中,我们首先从标准输入读取了字符串数量 `n`,然后动态分配了一个指针数组 `string`,用于存储输入的字符串。接着我们遍历指针数组 `string`,为每个字符串动态分配空间,然后使用 `scanf` 函数从标准输入读取字符串。最后,我们调用 `max_len` 函数,输出最长字符串的长度。
阅读全文