PAT 1062 (25’)
一道给结构体排序的中规中矩的题目。
遇到的问题:
- 审题,最后是按照序号的升序排列。
- 运行超时:数据量大输入是使用
scanf
代替cout
. 10^6的数据量,相差大概100ms。 - 尽量别用指针。
- AC的代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, L, H;
typedef struct info{
int s;
int virtue;
int talent;
int total;
}person;
vector<person> sages;
vector<person> noblemen;
vector<person> foolmen;
vector<person> smallmen;
bool cmp(person x, person y){
if (x.total != y.total) return x.total > y.total;
else if (x.virtue != y.virtue) return x.virtue > y.virtue;
else return x.s < y.s;
}
int main(){
// cin >> N >> L >> H;
scanf("%d %d %d", &N, &L, &H);
for (int i = 0; i < N; i++){
person pp;
// cin >> pp.s >> pp.virtue >> pp.talent;
scanf("%d %d %d", &pp.s, &pp.virtue, &pp.talent);
pp.total = pp.virtue + pp.talent;
if (pp.talent>=L && pp.virtue>=L){
if (pp.talent>=H && pp.virtue>=H) sages.push_back(pp);
else if (pp.talent<H && pp.virtue>=H) noblemen.push_back(pp);
else if (pp.talent<H && pp.virtue<H && pp.talent<=pp.virtue) foolmen.push_back(pp);
else smallmen.push_back(pp);
}
}
cout << sages.size()+noblemen.size()+foolmen.size()+smallmen.size() << endl;
sort(sages.begin(), sages.end(), cmp);
sort(noblemen.begin(), noblemen.end(), cmp);
sort(foolmen.begin(), foolmen.end(), cmp);
sort(smallmen.begin(), smallmen.end(),cmp);
for (int k = 0; k < (int)sages.size(); k++){
cout << sages[k].s << " " << sages[k].virtue << " " << sages[k].talent << endl;
}
for (int k = 0; k < (int)noblemen.size(); k++){
cout << noblemen[k].s << " " << noblemen[k].virtue << " " << noblemen[k].talent << endl;
}
for (int k = 0; k < (int)foolmen.size(); k++){
cout << foolmen[k].s << " " << foolmen[k].virtue << " " << foolmen[k].talent << endl;
}
for (int k = 0; k < (int)smallmen.size(); k++){
cout << smallmen[k].s << " " << smallmen[k].virtue << " " << smallmen[k].talent << endl;
}
return 0;
}
PAT 1063 (20’)
double
类型的格式说明符为%lf
.
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 3;
double game[maxn][maxn];
int main(){
for (int i = 0; i < 3; i++){
scanf("%lf %lf %lf", &game[i][0], &game[i][1], &game[i][2]);
}
float res = 1;
for (int j = 0; j < 3; j++){
float tmp = game[j][0];
char s = 'W';
if (tmp < game[j][1]){
tmp = game[j][1];
s = 'T';
}
if (tmp < game[j][2]){
tmp = game[j][2];
s = 'L';
}
printf("%c ", s);
res *= tmp;
}
printf("%.2lf\n", (res*0.65-1)*2);
return 0;
}
PAT 1015 (20’)
- 采用昨天使用的 素数表 判断数是否为素数较为简单。
radix
数的基,即进制数。
#include<iostream>
using namespace std;
const int maxn = 100010;
bool prime[maxn] = {0};
// 构造素数表
void prime_table(){
prime[0] = true;
prime[1] = true;
for (int i = 2; i < maxn; i++){
if (prime[i] == false){
for (int j = i + i; j < maxn; j=j+i){
prime[j] = true;
}
}
}
}
int main(){
int n, d;
prime_table();
while(scanf("%d", &n), n>=0){ // scanf("%d %d", &n, &d) == 2
scanf("%d", &d);
int n1 = 0;
int tmp = n;
while(tmp){
n1 = n1*d + tmp%d;
tmp = tmp/d;
}
if (prime[n] == false && prime[n1] == false)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}