博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Letter Game[USACO]
阅读量:5324 次
发布时间:2019-06-14

本文共 3605 字,大约阅读时间需要 12 分钟。

 

这道题感觉没什么困难的。只是注意,不要重复。(也可以在输出的时候控制不输出重复结果)

 

/*ID: zhangyc1LANG: C++TASK: lgame*/#include 
#include
#include
#include
#include
#include
using namespace std;char strGiven[10], strDict[10];int nSizeGiven = 0;int arrWeight[26] = {2, 5, 4, 4, 1, 6, 5, 5, 1, 7, 6, 3, 5, 2, 3, 5, 7, 2, 1, 2, 4, 6, 6, 7, 5, 7};int arrCountGiven[26], arrCountDict[26];char dict[40000][10];struct SRecord { int nScore; char strRs[10];};SRecord sArrRecord[40000];int nDictSize = 0, nRsSize = 0;ofstream fileout("lgame.out");int compare(const void* argv1, const void* argv2){ const SRecord* p1 = (const SRecord*)argv1; const SRecord* p2 = (const SRecord*)argv2; if (p1->nScore == p2->nScore) { return strcmp(p1->strRs, p2->strRs); } else return p2->nScore - p1->nScore;}void prepairData(){ ifstream filein("lgame.in"); filein.getline(strGiven, sizeof(strGiven)); filein.close(); memset(arrCountGiven, 0, sizeof(arrCountGiven)); int i = 0; while (strGiven[i] != '\0') { arrCountGiven[strGiven[i] - 'a']++; i++; } nSizeGiven = i; ifstream fileDict("lgame.dict"); while (fileDict >> strDict && strDict[0] != '.') { memset(arrCountDict, 0, sizeof(arrCountDict)); int nSizeStrDict = strlen(strDict); if (nSizeStrDict > nSizeGiven) continue; bool bValid = true; for (i = 0; i < nSizeStrDict; i++) { if (arrCountGiven[strDict[i]-'a'] == 0) { bValid = false; break; } arrCountDict[strDict[i]-'a']++; if (arrCountDict[strDict[i]-'a'] > arrCountGiven[strDict[i]-'a']) { bValid = false; break; } } if (bValid) { strcpy(dict[nDictSize], strDict); nDictSize++; } } fileDict.close();}void process(){ int nSum = 0; for (int i = 0; i < nSizeGiven; i++) { nSum += arrWeight[strGiven[i] - 'a']; } int arrCountTemp1[26], arrCountTemp2[26]; for (int i = 0; i < nDictSize; i++) { memset(arrCountTemp1, 0, sizeof(arrCountTemp1)); int nSizeI = strlen(dict[i]); int j = 0, nSumI = 0; for (; j < nSizeI; j++) { arrCountTemp1[dict[i][j] - 'a']++; nSumI += arrWeight[dict[i][j] - 'a']; } if (nSizeGiven == 6 && nSizeI == 3) j = i; else j = 0; if (nSizeGiven - nSizeI >= 3) { if (nSizeI > nSizeGiven / 2) { continue; } for (; j < nDictSize; j++) { int nSizeJ = strlen(dict[j]), nSumJ = 0; if (nSizeJ + nSizeI > nSizeGiven || (nSizeJ == nSizeI && j < i)) { continue; } memset(arrCountTemp2, 0, sizeof(arrCountTemp2)); for (int k = 0; k < nSizeJ; k++) { arrCountTemp2[dict[j][k] - 'a']++; nSumJ += arrWeight[dict[j][k] - 'a']; } bool bMatch = true; for (int k = 0; k < 26; k++) { if (arrCountTemp1[k] + arrCountTemp2[k] > arrCountGiven[k]) { bMatch = false; break; } } if (bMatch) { sArrRecord[nRsSize].nScore = nSumI + nSumJ; if (strcmp(dict[i], dict[j]) > 0) { strcpy(sArrRecord[nRsSize].strRs, dict[j]); sArrRecord[nRsSize].strRs[nSizeJ] = ' '; strcpy(sArrRecord[nRsSize].strRs + nSizeJ + 1, dict[i]); } else { strcpy(sArrRecord[nRsSize].strRs, dict[i]); sArrRecord[nRsSize].strRs[nSizeI] = ' '; strcpy(sArrRecord[nRsSize].strRs + nSizeI + 1, dict[j]); } nRsSize++; } } } sArrRecord[nRsSize].nScore = nSumI; strcpy(sArrRecord[nRsSize].strRs, dict[i]); nRsSize++; } qsort(sArrRecord, nRsSize, sizeof(SRecord), compare); fileout << sArrRecord[0].nScore << endl; fileout << sArrRecord[0].strRs << endl; for (int i = 1; i < nRsSize && sArrRecord[i].nScore == sArrRecord[0].nScore; i++) { if (strcmp(sArrRecord[i].strRs, sArrRecord[0].strRs) == 0) { continue; } fileout << sArrRecord[i].strRs << endl; }}int main(){ prepairData(); process(); fileout.close(); return 0;}

  

转载于:https://www.cnblogs.com/doublemystery/archive/2013/04/11/3015075.html

你可能感兴趣的文章
08.存储Cinder→5.场景学习→08.Backup Volume→1.概述与配置
查看>>
详谈js面向对象 javascript oop,持续更新
查看>>
关于这次软件以及pda终端的培训
查看>>
jQuery上传插件Uploadify 3.2在.NET下的详细例子
查看>>
解决input框自动填充为黄色的问题
查看>>
音视频基础知识(一)
查看>>
CyclicBarrier的使用
查看>>
小程序开发笔记
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
安装scikit-learn过程记录
查看>>
数据库的标识符可以有多长
查看>>
新手村之循环!循环!循环!
查看>>
在创业公司上班的感受
查看>>
Shell脚本
查看>>
masm32V11配置
查看>>
ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath
查看>>
通过Python、BeautifulSoup爬取Gitee热门开源项目
查看>>
正则表达式的用法
查看>>
线程安全问题
查看>>
集合的内置方法
查看>>