魔鬼PAT训练 DAY1
魔鬼PAT训练 DAY1
3.1.简单模拟
B1001.害死人不偿命的(3n+1)猜想 (15')
#include <iostream>
using namespace std;
int main() {
int N, cnt = 0;
scanf("%d", &N);
while(N != 1) {
if(N % 2 == 0) N /= 2;
else N = (3 * N + 1) / 2;
cnt++;
}
printf("%d", cnt);
return 0;
}
B1011.A+B和C (15')
#include <iostream>
using namespace std;
int main() {
long long N, a, b, c;
scanf("%d", &N);
for(int i = 1; i <= N; i++) {
scanf("%lld%lld%lld", &a, &b, &c);
if(a + b > c) printf("Case #%d: true\n", i);
else printf("Case #%d: false\n", i);
}
return 0;
}
B1016.部分A+B (15')
#include <iostream>
using namespace std;
int main() {
string s1, s2;
int a, b, c = 0, d = 0;
cin >> s1 >> a >> s2 >> b;
for(int i = 0; i < s1.size(); i++)
if(s1[i] - '0' == a) c = c * 10 + a;
for(int i = 0; i < s2.size(); i++)
if(s2[i] - '0' == b) d = d * 10 + b;
printf("%d", c + d);
return 0;
}
B1026.程序运行时间 (15')
#include <iostream>
using namespace std;
int main() {
long long a, b, c, sec, min, hour;
scanf("%lld%lld", &a, &b);
c = (b - a + 50) / 100;
sec = c % 60;
min = c / 60 % 60;
hour = c / 3600;
printf("%02lld:%02lld:%02lld", hour, min, sec);
return 0;
}
B1046.划拳 (15')
#include <iostream>
using namespace std;
int main() {
int N, a, b, c, d, cnt1 = 0, cnt2 = 0;
scanf("%d", &N);
while(N--) {
scanf("%d%d%d%d", &a, &b, &c, &d);
if(a + c == b && a + c != d) cnt2++;
if(a + c != b && a + c == d) cnt1++;
}
printf("%d %d", cnt1, cnt2);
return 0;
}
B1008.数组元素循环右移问题 (20')
#include <iostream>
using namespace std;
int main() {
int N, M, arr[10000];
scanf("%d%d", &N, &M);
for(int i = 0; i < N; i++)
scanf("%d", &arr[(i + M) % N]);
for(int i = 0; i < N; i++)
if(i == 0) printf("%d", arr[i]);
else printf(" %d", arr[i]);
return 0;
}
B1012.数字分类 (20')
#include <iostream>
using namespace std;
int main() {
int N, tmp, A1 = 0, A2 = 0, A3 = 0, A4 = 0, A5 = 0;
int flag = 1, cnt4 = 0;
bool b1 = 0, b2 = 0, b3 = 0, b4 = 0, b5 = 0;
scanf("%d", &N);
while(N--) {
scanf("%d", &tmp);
if(tmp % 10 == 0) {
A1 += tmp;
b1 = 1;
}
if(tmp % 5 == 1) {
A2 += (flag * tmp);
flag = -flag;
b2 = 1;
}
if(tmp % 5 == 2) {
A3++;
b3 = 1;
}
if(tmp % 5 == 3) {
A4+=tmp;
cnt4++;
b4 = 1;
}
if(tmp % 5 == 4 && tmp > A5) {
A5 = tmp;
b5 = 1;
}
}
if(!b1) printf("N");
else printf("%d", A1);
if(!b2) printf(" N");
else printf(" %d", A2);
if(!b3) printf(" N");
else printf(" %d", A3);
if(!b4) printf(" N");
else printf(" %.1f", (double)A4 / cnt4);
if(!b5) printf(" N");
else printf(" %d", A5);
return 0;
}
B1018.锤子剪刀布 (20')
#include <iostream>
using namespace std;
char max(int a, int b, int c){
int max = a;
max < b? max = b: 0;
max < c? max = c: 0;
if(max == c){
return 'B';
}else if(max == a){
return 'C';
}else{
return 'J';
}
}
int main()
{
int cnt;
char a, b;
int jy = 0,jp = 0;//甲胜利和平局
int jc = 0, jj = 0, jb = 0, yc = 0, yj = 0, yb = 0;
cin >> cnt;
for(int i = 0; i < cnt; i++) {
cin >> a >> b;
if(a == b) jp++;
else if((a == 'C' && b == 'J') || (a == 'J' && b == 'B') || (a == 'B'&&b == 'C')) {
jy++;
switch(a) {
case 'C': jc++; break;
case 'J': jj++; break;
case 'B': jb++; break;
}
}else {
switch(b) {
case 'C': yc++; break;
case 'J': yj++; break;
case 'B': yb++; break;
}
}
}
cout << jy << " " << jp << " " << (cnt - jy - jp) << endl;
cout << (cnt - jy - jp) << " " << jp << " " << jy << endl;
cout << max(jc, jj, jb) << " " << max(yc, yj, yb);
system("pause");
return 0;
}
A1042.Shuffling Machine (20')
#include <iostream>
using namespace std;
int main() {
int N;
int change[54];
string card[] = {
"S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "S10", "S11", "S12", "S13",
"H1", "H2", "H3", "H4", "H5", "H6", "H7", "H8", "H9", "H10", "H11", "H12", "H13",
"C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13",
"D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "D11", "D12", "D13",
"J1", "J2"};
string cp[54];
scanf("%d", &N);
for(int i = 0; i < 54; i++)
scanf("%d", &change[i]);
while(N--) {
for(int i = 0; i < 54; i++)
cp[change[i] - 1] = card[i];
for(int i = 0; i < 54; i++)
card[i] = cp[i];
}
printf("%s", card[0].data());
for(int i = 1; i < 54; i++)
printf(" %s", card[i].data());
system("pause");
return 0;
}
A1046.Shortest Distance (20')
(超时想到贪心)
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M, a, b, sum = 0;
scanf("%d", &N);
vector<int> dis(N + 1);
dis[0] = 0;
for(int i = 1; i <= N; i++) {
scanf("%d", &dis[i]);
sum += dis[i];
dis[i] += dis[i - 1];
}
scanf("%d", &M);
while(M--) {
scanf("%d%d", &a, &b);
if(a > b) swap(a, b);
int len = dis[b - 1] - dis[a - 1];
printf("%d\n", min(sum - len, len));
}
return 0;
}
1065.A+B and C(64bit) (20')
(大数问题想到Java)
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
BigInteger A, B, C;
for(int i = 1; i <= N; i++) {
A = sc.nextBigInteger();
B = sc.nextBigInteger();
C = sc.nextBigInteger();
if(A.add(B).compareTo(C)>0)
System.out.printf("Case #%d: true\n", i);
else
System.out.printf("Case #%d: false\n", i);
}
}
}
B1010.一元多项式求导
(多项式问题想到map)
#include <iostream>
using namespace std;
int main() {
int a, b, flag = 1;
int m[10000] = {0};
while(~scanf("%d%d", &a, &b)) {
a *= b;
b--;
m[b] += a;
}
for(int i = 9999; i >= 0; i--) {
if(m[i] != 0) {
if(!flag) printf(" ");
printf("%d %d", m[i], i);
flag = 0;
}
}
if(flag) printf("0 0");
return 0;
}
A1002.A+B for Polynomials(25')
(多项式问题想到map)
#include <iostream>
#include <map>
using namespace std;
int main()
{
int M, coef, coun=2;
double expo;
map<int, double, greater<int>> m;
while(coun--){
cin >> M;
while(M--){
cin >> coef >> expo;
m[coef] += expo;
}
}
for(auto it = m.begin(); it != m.end(); it++)
if(it -> second == 0) m.erase(it);
cout << m.size();
for(auto it: m)
printf(" %d %.1f", it.first, it.second);
return 0;
}
A1009.Product of Polynomials(25')
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
int M, N;
scanf("%d", &M);
vector<pair<int, double>> poly1(M);
for(int i = 0; i < M; i++)
scanf("%d%lf", &poly1[i].first, &poly1[i].second);
scanf("%d", &N);
vector<pair<int, double>> poly2(N);
for(int i = 0; i < N; i++)
scanf("%d%lf", &poly2[i].first, &poly2[i].second);
map<int, double, greater<int>> m;
for(int i = 0; i < poly1.size(); i++)
for(int j = 0; j < poly2.size(); j++)
m[poly1[i].first + poly2[j].first] += poly1[i].second * poly2[j].second;
for(auto it = m.begin(); it != m.end(); it++)
if(it->second == 0) m.erase(it);
printf("%d", m.size());
for(auto it = m.begin(); it != m.end(); it++)
printf(" %d %.1f", it->first, it->second);
system("pause");
return 0;
}
3.2.查找元素
B1041.考试座位号(15')
#include <iostream>
#include <map>
using namespace std;
int main() {
int N, M, tmp_i;
pair<string, int> tmp_p;
map<int, pair<string, int>> m;
scanf("%d", &N);
for(int i = 0; i < N; i++) {
cin >> tmp_p.first >> tmp_i >> tmp_p.second;
m[tmp_i] = tmp_p;
}
scanf("%d", &M);
while(M--) {
scanf("%d", &tmp_i);
printf("%s %d\n", m[tmp_i].first.c_str(), m[tmp_i].second);
}
return 0;
}
B1004.成绩排名(20')
#include <iostream>
using namespace std;
int main() {
string x_max, m_max, x_min, m_min;
string x_tmp, m_tmp;
int N, s_max = -1, s_min = 1000, s_tmp;
scanf("%d", &N);
while(N--) {
cin >> x_tmp >> m_tmp >> s_tmp;
if(s_tmp > s_max) {
s_max = s_tmp;
x_max = x_tmp;
m_max = m_tmp;
}
if(s_tmp < s_min) {
s_min = s_tmp;
x_min = x_tmp;
m_min = m_tmp;
}
}
printf("%s %s\n%s %s", x_max.data(), m_max.data(), x_min.data(), m_min.data());
system("pause");
return 0;
}
B1028.人口普查
#include <iostream>
using namespace std;
int main() {
int N, cnt = 0;
scanf("%d", &N);
string name_max, name_min, date_max = "", date_min = "9999/99/99";
string name_tmp, date_tmp;
while(N--) {
cin >> name_tmp >> date_tmp;
if(date_tmp <= "2014/09/06" && date_tmp >= "1814/09/06") {
if(date_tmp > date_max) {
date_max = date_tmp;
name_max = name_tmp;
}
if(date_tmp < date_min) {
date_min = date_tmp;
name_min = name_tmp;
}
cnt++;
}
}
if(cnt == 0) printf("0");
else printf("%d %s %s", cnt, name_min.data(), name_max.data());
return 0;
}
B1032.挖掘机技术那家强
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, int, greater<int>> m;
int a, b, N, mk, mv = 0;
scanf("%d", &N);
while(N--) {
scanf("%d%d", &a, &b);
m[a] += b;
}
for(auto x: m) {
if(x.second > mv) {
mk = x.first;
mv = x.second;
}
}
printf("%d %d", mk, mv);
return 0;
}
A1011.World Cup Betting(20')
#include <iostream>
using namespace std;
int main() {
double m_num[3];
double w, t, l, m;
char m_char[3];
for(int i = 0; i < 3; i++){
scanf("%lf%lf%lf", &w, &t, &l);
m = max(max(w, t), l);
if(m == w){
m_char[i] = 'W';
m_num[i] = m;
}else if(m == t){
m_char[i] = 'T';
m_num[i] = m;
}else {
m_char[i] = 'L';
m_num[i] = m;
}
}
double res = (m_num[0] * m_num[1] * m_num[2] * 0.65 - 1) * 2;
printf("%c %c %c %.2f", m_char[0], m_char[1], m_char[2], res);
return 0;
}
A1006.Sign In and Sign Out(25')
#include <iostream>
using namespace std;
int main() {
int M;
scanf("%d", &M);
string maxid, _max="", minid, _min="1111 1111", tmp, start, _end;
while(M--) {
cin >> tmp >> start >> _end;
if(start < _min) {
_min = start;
minid = tmp;
}
if(_end > _max) {
_max = _end;
maxid = tmp;
}
}
cout << minid << " " << maxid;
return 0;
}
A1036.Boys vs Girls(25')
#include <iostream>
using namespace std;
struct stu {
string name = "Absent", sex, id;
int grade;
};
int main() {
int N;
scanf("%d", &N);
stu _max, _min, tmp;
_max.grade = -1;
_min.grade = 101;
while(N--) {
cin >> tmp.name >> tmp.sex >> tmp.id >> tmp.grade;
if(tmp.sex == "F" && tmp.grade > _max.grade) _max = tmp;
if(tmp.sex == "M" && tmp.grade < _min.grade) _min = tmp;
}
if(_max.name == "Absent") cout << _max.name << endl;
else cout << _max.name << " " << _max.id << endl;
if(_min.name == "Absent") cout << _min.name << endl;
else cout << _min.name << " " << _min.id << endl;
if(_max.name == "Absent" || _min.name == "Absent")
cout << "NA" << endl;
else cout << _max.grade - _min.grade << endl;
system("pause");
return 0;
}
3.3.图形输出
B1036.跟奥巴马一起学编程
#include <iostream>
using namespace std;
int main() {
int N; char c;
scanf("%d %c", &N, &c);
for(int i = 0; i < N; i++) putchar(c);
putchar('\n');
for(int i = 0; i < (double)N / 2 - 2; i++) {
putchar(c);
for(int j = 0; j < N-2; j++) putchar(' ');
putchar(c);
putchar('\n');
}
for(int i = 0; i < N; i++) putchar(c);
return 0;
}
B1027.打印沙漏(20')
#include <iostream>
using namespace std;
int main() {
int N, level = 0, cnt = 0, sum; char c;
scanf("%d %c", &N, &c);
while(2 * level * level - 1 <= N) level++;
sum = 2 * (--level) * level -1;
for(int i = level; i > 0; i--, cnt++){
for(int j = 0; j < cnt; j++) putchar(' ');
for(int j = 2 * i - 1; j > 0; j--) putchar(c);
putchar('\n');
}
cnt -= 2;
for(int i = 2; i <= level; i++, cnt--) {
for(int j = 0; j < cnt; j++) putchar(' ');
for(int j = 2 * i - 1; j > 0; j--) putchar(c);
putchar('\n');
}
printf("%d", N - sum);
system("pause");
return 0;
}
A1031.Hello World for U (20')
#include <iostream>
using namespace std;
int main() {
string str;
getline(cin, str);
int row, N = str.length(), recol;
row = (N + 2) / 3 ;
recol = (N + 2) / 3 + (N + 2) % 3 - 2;
for(int i = 0; i < row; i++){
cout << str[i];
for(int j = 0; j < recol; j++)
if(i != row - 1) cout << " ";
else cout << str[j + row];
cout << str[N - i -1] << endl;
}
return 0;
}
3.5.进制转换
B1022.D进制的A+B(20')
#include <iostream>
#include <stack>
using namespace std;
int main() {
int A, B, D, sum;
scanf("%d%d%d", &A, &B, &D);
sum = A + B;
if(sum == 0) putchar('0');
stack<int> s;
while(sum != 0) {
s.push(sum % D);
sum /= D;
}
while(!s.empty()) {
printf("%d", s.top());
s.pop();
}
return 0;
}
B1037.在霍格沃茨找零钱
#include <iostream>
using namespace std;
int main() {
int ag, as, ak, bg, bs, bk, rg, rs, rk;
scanf("%d.%d.%d %d.%d.%d", &ag, &as, &ak, &bg, &bs, &bk);
rg = bg - ag; rs = bs - as; rk = bk -ak;
if(rg < 0 || (rg == 0 && rs < 0) || (rg == 0 && rs == 0 && rk < 0)) {
putchar('-');
rg = -rg;
rs = -rs;
rk = -rk;
}
while(rk < 0) {
rs--;
rk += 29;
}
while(rs < 0) {
rg--;
rs += 17;
}
printf("%d.%d.%d", rg, rs, rk);
system("pause");
return 0;
}
A1019.General Polindromic Number(20')
#include <iostream>
#include <deque>
using namespace std;
int main(){
int N, R;
cin >> N >> R;
deque<int> d, dr;
while(N != 0){
d.push_back(N % R);
dr.push_front(N % R);
N /= R;
}
bool right = true;
for(int i = 0; i < d.size(); i++)
if(d[i] != dr[i]) right = false;
cout << (right ? "Yes" : "No") << endl;
for(int i = 0; i < dr.size(); i++)
if(i != 0) cout << " " << dr[i];
else cout << dr[i];
return 0;
}
A1027.Color in Mars(20')
#include <iostream>
using namespace std;
int main() {
int a, b, c;
char ch[] = "0123456789ABC";
scanf("%d%d%d", &a, &b, &c);
printf("#%c%c%c%c%c%c", ch[a/13], ch[a%13], ch[b/13], ch[b%13], ch[c/13], ch[c%13]);
return 0;
}
A1058.A+B in Hogwarts(20')
#include <iostream>
using namespace std;
int main(){
int a,b,c,d,e,f;
scanf("%d.%d.%d %d.%d.%d",&a,&b,&c,&d,&e,&f);
a+=d;b+=e;c+=f;
b+=c/29;c%=29;
a+=b/17;b%=17;
printf("%d.%d.%d",a,b,c);
return 0;
}