SDUT 2411 Pixel density(模拟,字符串)

题目链接:SDUT 2411 Pixel density

这一题,可以说题目略坑。为什么呢,第一就是他题意描述过于模糊,第二题输出格式有点坑(说到底还是题意不要表述清晰)。现在我们来看看这一题吧,这一题是 《2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛》 的题。本题可以说是一道着重于细节的一道题。对于细节没有把握清楚的话,就是WA。据说当时某些队伍就是因为细节没有把握好,结果硬是WA了26次(深表同情啊)。我们仔细观察题目的话,可以发现 他给我们的格式是 “名称 + 屏幕大小(以英寸为单位)+ inches + 屏幕规格(Wp*Hp)
+  类型”。其中加号的位置可以有若干个空格,当然在名称和类型中也可以有若干个空格。最后输出的时候,字符串之间只能有一个空格,类型必须转化为小写,最后一行不能有换行符。还有一个坑,就是当Inch为0的情况,这是你就要另外处理。题目想说的大概就是这样。

这一题我的解法是这样的: 首先,我先建立一个二维数组,将输入的字符串,看成若干个不包含空格的字符串。然后找到最后一个 inches 并将其的位置记录下来。这样的话,它前一个字符串自然就是屏幕的大小了,后一个字符串就是规格了。这样我们就可以将原先一大串的字符串,分开处理了。那我们以什么来判断结尾呢?仔细研究一下题目,发现它对每一个样例就只有一行,那么我们就可以用 ’\n‘来判断输入结束了。下面附上代码,供大家辅助理解我想表达的意思。

【代码如下】

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXN 100 + 10
#define N 1000 + 10
#define NES 1e-6
char s[N][MAXN];
int T, flog, cnt;
char szName[MAXN],szType[MAXN],Outstr[3*MAXN]; //不用太纠结我为什么是3*MAXN,只要让他的值大于2*MAXN就好了
double PPI(double Inch, double Wp, double Hp){
    return sqrt( Wp * Wp + Hp * Hp ) / Inch;
}
void Change(char *str){
    int len = strlen(str);
    for(int i = 0; i < len; i++){
        if(str[i]>='A'&&str[i]<='Z')
            str[i] += 32;
    }
    return ;
}
void Init(){
    flog = cnt = 0;
    memset(szName,0,sizeof(szName));
    memset(szType,0,sizeof(szType));
}
int main(){
    int i, p, k = 0;
    double Inch, Wp, Hp, ans;
    scanf("%d",&T);
    getchar();
    while(T--){
        Init();
        while(scanf("%s",s[cnt])){
            if(!strcmp(s[cnt],"inches")) flog = cnt;    //保存最后一个Inches的位置
            if(getchar() == '\n') break;
            cnt++;
        }
        sscanf(s[flog-1],"%lf",&Inch);
        sscanf(s[flog+1],"%lf*%lf",&Wp,&Hp);
        for(i = 0; i < flog-1; i++){
            if(i) strcat(szName," ");
            strcat(szName,s[i]);
        }
        for(i = flog+2, p = 0; i <= cnt; p++, i++){
            if(p) strcat(szType," ");
            strcat(szType,s[i]);
        }
        Change(szType);
        if(fabs(Inch) < NES) ans = 0.00;    //因为存在浮点数误差所以不能直接写成 Inch == 0
        else ans = PPI(Inch,Wp,Hp);
        sprintf(Outstr,"Case %d: The %s of %s's PPI is %.2lf.",++k,szType,szName,ans);
        printf("%s",Outstr);
        if(T) printf("\n");
    }
    return 0;
}

这一题虽然AC了,但是我还是有一些疑问。题意既然没有说 类型 一定是大写的,那么就有小写的存在,既然有小写的存在那么在类型中不能有inches呢。嗨,说到底这一题题意过于朦胧,让人琢磨不清。还有人使用屏幕尺寸前的两个空格进行判断,也是能够AC。现在想想估计也能明白,但是为什么会有人WA了26次。估计就是考虑了,太多了。如果大家还有什么其他的看法,欢迎一起探讨。

(如有错误,欢迎指正,转载请注明出处)





时间: 2024-11-05 19:31:49

SDUT 2411 Pixel density(模拟,字符串)的相关文章

sdut 2411:Pixel density(第三届山东省省赛原题,字符串处理)

Pixel density Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Pixels per inch (PPI) or pixel density is a measurement of the resolution of devices in various contexts; typically computer displays, image scanners, and digital camera image s

Sdut2411 Pixel density 山东省第三届ACM省赛(输入输出字符串处理)

本文出处:http://blog.csdn.net/svitter 原题:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2411 题意:给你一个串,让你依据那个串来输出ppi.坑特别多.ppi的计算方法是dp / inches; dp = sqrt(wp*wp + hp * hp); 现在我来说说这个题目有多坑: 给你的串的格式是这样: name + inches+ "inches"

2012山东省ACM省赛-Pixel density

Pixel density 题目描述 Pixels per inch (PPI) or pixel density is a measurement of the resolution of devices in various contexts; typically computer displays, image scanners, and digital camera image sensors. Note, the unit is not square inches. Good qual

模拟/字符串处理 UVALive 6833 Miscalculatio

题目传送门 1 /* 2 模拟/字符串处理:主要是对*的处理,先把乘的预处理后再用加法,比如说是:1+2*3+4 = 1+..6+4 = 11 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <string> 8 #include <cmath> 9 #include <vector> 10 #include <map

洛谷P1449 后缀表达式 栈 模拟 字符串

洛谷P1449 后缀表达式 栈 模拟 字符串 栈模拟一下 碰到 . 如果输入的是数字就把数字放进栈中 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <io

uva 1156 - Pixel Shuffle(模拟+置换)

题目链接:uva 1156 - Pixel Shuffle 题目大意:给定一个N*N的黑白位图,有7种操作,并且对应在指令后加上'-'即为操作的逆,给定N和一系列操作,(从最后一个开始执行),问说这一套指令需要执行多少次才能形成循环. 解题思路:模拟指令执行后获得一个置换,分解成若干的循环,各个循环长度的最小公倍数即使答案. #include <cstdio> #include <cstring> #include <algorithm> using namespace

java基础知识回顾之---java String final类普通方法的应用之“模拟字符串Trim方法”

/* * 4,模拟一个trim功能一致的方法.去除字符串两端的空白  * 思路: * 1,定义两个变量. * 一个变量作为从头开始判断字符串空格的角标.不断++. * 一个变量作为从尾开始判断字符串空格的角标.不断--. * 2,判断到不是空格为止,取头尾之间的字符串即可. *  *  使用char charAt(int index);方法根据index索引,取出字符串 *  使用String substring(int beginIndex, int endIndex)//包含begin 不包

POJ 1016 模拟字符串

Numbers That Count Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20396   Accepted: 6817 Description "Kronecker's Knumbers" is a little company that manufactures plastic digits for use in signs (theater marquees, gas station price

Codeforces Round #297 (Div. 2)(模拟+字符串+排序)

A. 题目链接:点击打开链接 解题思路: 大意就是说奇数位给小写字母,偶数位给大写字母,然后小写对应钥匙,大写对应门,问最少消耗几把钥匙能打开所有门. 简单模拟即可,初始化一个英文字母数组,如果遇到小写字母,我们把相应的计数器++,遇到大写,如果它对应的数组值不为0,那么我们将其--, 否则购买一把钥匙. 完整代码: #include <iostream> #include <cstdio> #include <algorithm> #include <cstri