PAT (Basic Level) Practise(中文)----30題解題報告
注:這裡涵蓋了PAT BASIC的全部30道題,難度較易,但還是為初學者做一個參考,最好自己想出思路,找出錯誤資料,程式碼僅供參考。
1001 注意統計砍一半的次數
1002 不解釋#include <iostream> #include <cstdio> using namespace std; int n; void solve() { int cnt = 0; while(n != 1) { if(n & 1) n = (3*n+1)>>1; else n >>= 1; cnt++; } printf("%d\n", cnt); } int main() { while(~scanf("%d", &n)) { solve(); } }
1003 我要通過#include <iostream> #include <cstdio> #include <stack> using namespace std; char s[1010]; string dig[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; void solve() { int i = 0, sum = 0; while(s[i] != '\0') { sum += s[i]-'0'; i++; } stack<int> stk; while(sum) { stk.push(sum%10); sum /= 10; } while(stk.size() > 1) { cout << dig[stk.top()] << " "; stk.pop(); } cout << dig[stk.top()] << endl; stk.pop(); } int main() { while(~scanf("%s", s)) solve(); return 0; }
有幾點注意:
1:不能有除P、A、T外其他字元,且P和T只能出現一次,且P在T左邊
2:說白了就是判斷(P左邊A的個數)*(P與T之間A的個數)是否等於(T右邊A的個數)。
1004 不解釋#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int t; char s[110]; scanf("%d", &t); while(t--) { scanf("%s", s); bool flag = true; int n = strlen(s); int pp = -1, pt = -1; for(int i = 0; i < n; i++) { if(s[i] != 'P' && s[i] != 'A' && s[i] != 'T') { flag = false; break;} if(s[i] == 'P') { if(pp == -1) pp = i; else {flag = false; break; } } if(s[i] == 'T') { if(pt == -1) pt = i; else {flag = false; break; } } } if(!flag || pt - pp < 2) { printf("NO\n"); continue; } if((pp*(pt-pp-1) == n-pt-1)) printf("YES\n"); else printf("NO\n"); } return 0; }
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
int n, grade[1010];
string name[1010], id[1010];
while(cin >> n) {
int maxg = 0, ming = 101, id1 = 0, id2 = 0;
for(int i = 0; i < n; i++) {
cin >> name[i] >> id[i] >> grade[i];
if(maxg < grade[i]) { id1 = i; maxg = grade[i]; }
if(ming > grade[i]) { id2 = i; ming = grade[i]; }
}
cout << name[id1] << " " << id[id1] << endl;
cout << name[id2] << " " << id[id2] << endl;
}
return 0;
}
1005 繼續3n+1猜想
數字有3中狀態:0未使用,1使用但為被覆蓋,2使用且被覆蓋。那麼重要的就是標記過程了,具體見程式碼。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n, a[110], vis[110], key[110];
bool cmp(int a, int b) {
return a > b;
}
void solve() {
for(int i = 0; i < n; i++) {
long long m = a[i];
if(vis[m] == 2) continue;
while(m != 1) {
if(m & 1) m = (m*3+1)>>1;
else m >>= 1;
if(m > 100) continue;
if(vis[m] == 2) break;
if(vis[m] == 1) vis[m] = 2;
}
}
int cnt = 0;
for(int i = 0; i <= 100; i++)
if(vis[i] == 1) key[cnt++] = i;
sort(key, key+cnt, cmp);
for(int i = 0; i < cnt-1; i++)
printf("%d ", key[i]);
printf("%d\n", key[cnt-1]);
}
int main() {
while(~scanf("%d", &n)) {
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
vis[a[i]] = 1;
}
solve();
}
return 0;
}
1006 不解釋
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int dig[3], n;
while(~scanf("%d", &n)) {
dig[0] = dig[1] = dig[2] = 0;
int i = 0;
while(n != 0) {
dig[i++] = n%10;
n /= 10;
}
if(dig[2] != 0) for(int i = 0; i < dig[2]; i++) printf("B");
if(dig[1] != 0) for(int i = 0; i < dig[1]; i++) printf("S");
if(dig[0] != 0) for(int i = 1; i <= dig[0]; i++) printf("%d", i);
printf("\n");
}
}
1007 用篩法把100000以內素數都求出來
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX_N = 100010;
int prime[MAX_N];
bool is_prime[MAX_N+1];
int cnt = 0, n;
void GetPrime() {
for(int i = 0; i <= MAX_N; i++) is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for(int i = 2; i <= MAX_N; i++)
if(is_prime[i]) {
prime[cnt++] = i;
for(int j = 2*i; j <= MAX_N; j += i)
is_prime[j] = false;
}
}
void solve() {
int res = 0;
for(int i = 1; i < cnt && prime[i] <= n; i++)
if(prime[i]-prime[i-1] == 2) res++;
printf("%d\n", res);
}
int main() {
GetPrime();
while(~scanf("%d", &n))
solve();
return 0;
}
1008 不解釋
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int n, m, a[110];
while(~scanf("%d%d", &n, &m)) {
m %= n;
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(int i = n-m; i < n; i++) printf("%d ", a[i]);
for(int i = 0; i < n-1-m; i++) printf("%d ", a[i]);
printf("%d\n", a[n-1-m]);
}
return 0;
}
1009 不解釋
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main() {
string str[100];
int n = 0;
while(cin >> str[n++]) ;
for(int i = n-2; i > 0; i--)
cout << str[i] << " ";
cout << str[0] << endl;
return 0;
}
1010 注意最後求得導數為0 的情況
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
//freopen("in.txt", "r", stdin);
bool flag = true;
int a[1010], b[1010];
int n = 0;
while(~scanf("%d", &a[n++])) ;
int cnt = 0;
for(int i = 0; i < n; i += 2)
if(a[i] != 0 && a[i+1] != 0 ) {
b[cnt++] = a[i]*a[i+1];
b[cnt++] = a[i+1]-1;
}
if(cnt == 0) printf("0 0\n");
else {
for(int i = 0; i < cnt-1; i++) printf("%d ", b[i]);
printf("%d\n", b[cnt-1]);
}
return 0;
}
1011 long long就可以過
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int t;
long long a, b, c;
scanf("%d", &t);
for(int cas = 1; cas <= t; cas++) {
scanf("%lld%lld%lld", &a, &b, &c);
printf("Case #%d: ", cas);
if(a+b > c) printf("true\n");
else printf("false\n");
}
return 0;
}
1012 注意每種數字個數為0的表示情況
#include <iostream>
#include <cstdio>
#include <iomanip>
using namespace std;
int main() {
//freopen("in.txt", "r", stdin);
int A1, A2, A3, A5, c2, c4, c5, x, N;
float A4;
while(~scanf("%d", &N)) {
int flag = 1;
A1 = A2 = A3 = A5 = c2 = c4 = c5 = 0;
A4 = 0;
while(N--) {
scanf("%d", &x);
if(x % 5 == 0) { if(x % 2 == 0) A1 += x; }
else if(x % 5 == 1) { A2 += flag*x; flag = -flag; c2++; }
else if(x % 5 == 2) A3++;
else if(x % 5 == 3) {A4 += x; c4++; }
else if(x % 5 == 4) { if(A5 < x) A5 = x; c5++; }
}
if(A1 == 0) printf("N ");
else printf("%d ", A1);
if(c2 == 0) printf("N ");
else printf("%d ", A2);
if(A3 == 0) printf("N ");
else printf("%d ", A3);
if(c4 == 0) printf("N ");
else printf("%.1f ", A4/c4);
if(c5 == 0) printf("N\n");
else printf("%d\n", A5);
}
return 0;
}
1013 範圍太大,依然用篩法,時間上有保證,但注意邊界
#include <iostream>
#include <cstdio>
using namespace std;
int prime[10010], n = 1;
bool is_prime[105000];
void GetPrime() {
for(int i = 0; i <= 105000; i++) is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for(int i = 2; i <= 105000; i++)
if(is_prime[i]) {
prime[n++] = i;
for(int j = 2*i; j <= 105000; j += i)
is_prime[j] = false;
}
}
int main() {
int N, M;
GetPrime();
while(~scanf("%d%d", &N, &M)) {
int cnt = 0;
for(int i = prime[N]; i <= prime[M]; i++) {
if(is_prime[i]) {
if(cnt == 0) { printf("%d", i); cnt++; }
else if(cnt < 9) { printf(" %d", i); cnt++; }
else { printf(" %d\n", i); cnt = 0; }
}
}
if((M-N+1)%10 != 0) printf("\n");
}
return 0;
}
1014 注意順序,還能不能好好的約會了!!!
#include <iostream>
#include <cstdio>
#include <ctype.h>
using namespace std;
char DAY[8][4] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
int main() {
char s1[66], s2[66], s3[66], s4[66];
int day, hour, minute;
while(~scanf("%s%s%s%s", s1, s2, s3, s4)) {
int id = 0;
for(int i = 0; s1[i] != '\0'; i++)
if(s1[i] == s2[i] && s1[i] >= 'A' && s1[i] <= 'G') { day = s1[i]-'A'; id = i; break; }
for(int i = id+1; s1[i] != '\0'; i++)
if(s1[i] == s2[i]) {
if(s1[i] >= 'A' && s1[i] <= 'N') { hour = s1[i]-'A'+10; break; }
else if(s1[i] >= '0' && s1[i] <= '9') { hour = s1[i]-'0'; break; }
}
for(int i = 0; s3[i] != '\0'; i++)
if(s3[i] == s4[i] && isalpha(s3[i])) { minute = i; break; }
printf("%s %02d:%02d\n", DAY[day], hour, minute);
}
return 0;
}
1015 分開成4種人,逐個進行排序
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct node {
int id, df, cf;
bool operator < (const node& rhs) const {
if(df+cf != rhs.df+rhs.cf) return df+cf > rhs.df+rhs.cf;
if(df != rhs.df) return df > rhs.df;
return id < rhs.id;
}
};
vector<node> one, two, thr, four;
int N, L, H;
int main() {
int id, cf, df, c1, c2, c3, c4;
while(~scanf("%d%d%d", &N, &L, &H)) {
one.clear(); two.clear(); thr.clear(); four.clear();
while(N--) {
scanf("%d%d%d", &id, &df, &cf);
if(df < L || cf < L) continue;
if(cf >= H && df >= H) one.push_back((node){id, df, cf});
else if(cf < H && df >= H) two.push_back((node){id, df, cf});
else if(cf < H && df < H && df >= cf) thr.push_back((node){id, df, cf});
else four.push_back((node){id, df, cf});
}
sort(one.begin(), one.end());
sort(two.begin(), two.end());
sort(thr.begin(), thr.end());
sort(four.begin(), four.end());
c1 = one.size(); c2 = two.size(); c3 = thr.size(); c4 = four.size();
printf("%d\n", c1+c2+c3+c4);
for(int i = 0; i < c1; i++)
printf("%d %d %d\n", one[i].id, one[i].df, one[i].cf);
for(int i = 0; i < c2; i++)
printf("%d %d %d\n", two[i].id, two[i].df, two[i].cf);
for(int i = 0; i < c3; i++)
printf("%d %d %d\n", thr[i].id, thr[i].df, thr[i].cf);
for(int i = 0; i < c4; i++)
printf("%d %d %d\n", four[i].id, four[i].df, four[i].cf);
}
}
1016 不解釋
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int a, b, da, db;
while(~scanf("%d%d%d%d", &a, &da, &b, &db)) {
int ca = 0, cb = 0;
while(a != 0) {
if(da == a%10) ca++;
a /= 10;
}
while(b != 0) {
if(db == b%10) cb++;
b /= 10;
}
int pa = 0, pb = 0;
int x = 1;
while(ca--) {
pa += da*x;
x *= 10;
}
x = 1;
while(cb--) {
pb += db*x;
x *= 10;
}
printf("%d\n", pa+pb);
}
return 0;
}
1017 手算怎麼算,你就怎麼算,注意商為0
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
char s[1010];
int n, b, a[1010], q[1010];
while(~scanf("%s%d", s, &b)) {
for(n = 0; s[n] != '\0'; n++) a[n] = s[n]-'0';
if(n == 1 && a[0] < b) { printf("0 %d\n", a[0]); continue; }
q[1] = 0;
for(int i = 0; i < n-1; i++) {
q[i] = a[i]/b;
a[i+1] += a[i]%b*10;
}
q[n-1] = a[n-1]/b;
if(q[0] != 0) printf("%d", q[0]);
for(int i = 1; i < n; i++) printf("%d", q[i]);
printf(" %d\n", a[n-1]%b);
}
return 0;
}
1018 不解釋
#include <iostream>
#include <cstdio>
using namespace std;
int judge(char x, char y) {
if(x == y) return 1;
if((x == 'C' && y == 'J') || (x == 'J' && y == 'B') || (x == 'B' && y == 'C')) return 0;
return 2;
}
int main() {
//freopen("in.txt", "r", stdin);
int N, JS, JP, J[3], Y[3];
char JIA, YI;
while(~scanf("%d", &N, &JIA)) {
JS = JP = J[0] = J[1] = J[2] = Y[0] = Y[1] = Y[2] = 0;
for(int i = 0; i < N; i++) {
scanf("\n%c %c", &JIA, &YI);
int ans = judge(JIA, YI);
if(ans == 0) {
JS++;
if(JIA == 'C') J[1]++;
else if(JIA == 'J') J[0]++;
else if(JIA == 'B') J[2]++;
}
else if(ans == 1) { JP++; }
else {
if(YI == 'C') Y[1]++;
else if(YI == 'J') Y[0]++;
else if(YI == 'B') Y[2]++;
}
}
printf("%d %d %d\n%d %d %d\n", JS, JP, N-JS-JP, N-JS-JP, JP, JS);
int maxj = 0, maxy = 0, idj, idy;
for(int i = 0; i < 3; i++) {
if(maxj <= J[i]) { maxj = J[i]; idj = i; }
if(maxy <= Y[i]) { maxy = Y[i]; idy = i; }
}
if(idj == 0) printf("J ");
else if(idj == 1) printf("C ");
else if(idj == 2) printf("B ");
if(idy == 0) printf("J\n");
else if(idy == 1) printf("C\n");
else if(idy == 2) printf("B\n");
}
return 0;
}
1019 注意一開始輸入就是6174的情況
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
void getnum(int& x, int& a, int& b) {
int num[5], n = 0;
num[0] = num[1] = num[2] = num[3] = 0;
while(x != 0) {
num[n++] = x%10;
x /= 10;
}
sort(num, num+4);
a = num[3]*1000+num[2]*100+num[1]*10+num[0];
b = num[0]*1000+num[1]*100+num[2]*10+num[3];
x = a - b;
}
int main() {
int a, b, x;
while(~scanf("%d", &x)) {
while(1) {
getnum(x, a, b);
printf("%04d - %04d = %04d\n", a, b, x);
if(x == 0 || x == 6174) break;
}
}
return 0;
}
1020 月餅單價排序
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node {
double sto, sell, price;
bool operator < (const node& rhs) const {
return price > rhs.price;
}
}MK[1010];
int N, D;
int main() {
while(~scanf("%d%d", &N, &D)) {
for(int i = 0; i < N; i++) scanf("%lf", &MK[i].sto);
for(int i = 0; i < N; i++) scanf("%lf", &MK[i].sell);
for(int i = 0; i < N; i++) MK[i].price = MK[i].sell/MK[i].sto;
sort(MK, MK+N);
double res = 0;
for(int i = 0; i < N; i++) {
if(D <= MK[i].sto) { res += MK[i].price*D; break; }
res += MK[i].sell;
D -= MK[i].sto;
}
printf("%.2lf\n", res);
}
return 0;
}
1021 不解釋
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
char s[1010], num[11];
while(~scanf("%s", s)) {
memset(num, 0, sizeof(num));
for(int i = 0; s[i] != '\0'; i++) num[s[i]-'0']++;
for(int i = 0; i < 10; i++)
if(num[i] != 0) printf("%d:%d\n", i, num[i]);
}
return 0;
}
1022 進位制轉換
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int dig[50], n, a, b, d;
while(~scanf("%d%d%d", &a, &b, &d)) {
int c = a+b;
if(c == 0) { printf("0\n"); continue; }
n = 0;
while(c != 0) {
dig[n++] = c%d;
c /= d;
}
for(int i = n-1; i >= 0; i--)
printf("%d", dig[i]);
printf("\n");
}
return 0;
}
1023 先取個非0最小數,再把所有0跟上,然後其他所有數從小到大排。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
int num[11];
while(~scanf("%d", &num[0])) {
for(int i = 1; i <= 9; i++) scanf("%d", &num[i]);
int id = 0;
for(int i = 1; i <= 9; i++) if(num[i] != 0) { id = i; break; }
printf("%d", id); num[id]--;
while(num[0]--) cout << "0";
for(int i = 1; i <= 9; i++) {
while(num[i]--) cout << i;
}
cout << endl;
}
return 0;
}
1024 科學計數法
指數為正式,主要問題在於判斷小數點最後變到了哪裡。
指數為負時,主要問題在於前面加上幾個0。
有很多細節要注意。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[10010];
int main() {
//freopen("in.txt", "r", stdin);
while(~scanf("%s", s)) {
if(s[0] == '-') printf("-");
int e = 4;
while(s[e] != 'E') e++;
int id = e+2, p2 = 0;
while(s[id] != '\0') { p2 = 10*p2+s[id]-'0'; id++; }
if(s[e+1] == '+') {
printf("%c", s[1]);
id = p2+2;
if(id < e) {
for(int i = 3; i <= id; i++) printf("%c", s[i]);
if(id != e-1) printf(".");
for(int i = id+1; i < e; i++) printf("%c", s[i]);
} else {
for(int i = 3; i < e; i++) printf("%c", s[i]);
for(int i = e; i <= id; i++) printf("0");
}
} else {
if(p2 == 0){
printf("%c.", s[1]);
} else {
printf("0.");
for(int i = 1; i < p2; i++) printf("0");
printf("%c", s[1]);
}
for(int i = 3; i < e; i++) printf("%c", s[i]);
}
printf("\n");
}
return 0;
}
1025 反轉連結串列
用陣列做可以不用反轉直接輸出來,但是判斷每段首尾挺麻煩,用STL的reverse實在方便。
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> P;
P coll[100010];
struct node {
int addr, data, next;
};
vector<node> LK;
int main() {
int n, k, head, addr, data, next;
while(~scanf("%d%d%d", &head, &n, &k)) {
LK.clear();
for(int i = 0; i < n; i++) {
scanf("%d%d%d", &addr, &data, &next);
P p;
p.first = data; p.second = next;
coll[addr] = p;
}
int cnt = 0, index = head;
while(index != -1) {
LK.push_back((node){index, coll[index].first, coll[index].second});
index = coll[index].second;
cnt++;
}
int t = cnt/k;
for(int i = 0; i < t; i++)
reverse(LK.begin()+i*k, LK.begin()+(i+1)*k);
t = LK.size();
for(int i = 0; i < t-1; i++)
printf("%05d %d %05d\n", LK[i].addr, LK[i].data, LK[i+1].addr);
printf("%05d %d -1\n", LK[t-1].addr, LK[t-1].data);
}
return 0;
}
1026 注意秒要四捨五入
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int C1, C2;
while(~scanf("%d%d", &C1, &C2)) {
int second = 1.0*(C2-C1)/100+0.5;
int hour = second/3600;
second %= 3600;
int minute = second/60;
second %= 60;
printf("%02d:%02d:%02d\n", hour, minute, second);
}
return 0;
}
1027 算了,也不解釋了
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main() {
int n;
char c;
while(~scanf("%d %c", &n, &c)) {
int x = sqrt(2.0*(n+1))-1;
if(x % 2 == 0) x--;
for(int i = x; i >= 1; i -= 2) {
for(int j = 0; j < (x-i)/2; j++)
printf(" ");
for(int j = 0; j < i; j++)
printf("%c", c);
printf("\n");
}
for(int i = 3; i <= x; i += 2) {
for(int j = 0; j < (x-i)/2; j++)
printf(" ");
for(int j = 0; j < i; j++)
printf("%c", c);
printf("\n");
}
printf("%d\n", n-(x+1)*(x+1)/2+1);
}
return 0;
}
1028 時間比較,注意過載比較運算子,邊界問題注意
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
struct date {
int year, month, day;
bool operator > (const date& rhs) const {
if(year != rhs.year) return year > rhs.year;
if(month != rhs.month) return month > rhs.month;
return day > rhs.day;
}
bool operator >= (const date& rhs) const {
if(year != rhs.year) return year > rhs.year;
if(month != rhs.month) return month > rhs.month;
return day >= rhs.day;
}
};
vector<string> name, bir;
int main() {
int n;
while(cin >> n) {
date mind, maxd, tmp, dlow, dhigh;
string nm, br;
maxd.year = 1814; maxd.month = 9; maxd.day = 6;
mind.year = 2014; mind.month = 9; mind.day = 6;
dlow = maxd; dhigh = mind;
int id1 = 0, id2 = 0, cnt = 0;
name.clear(); bir.clear();
for(int i = 0; i < n; i++) {
cin >> nm >> br;
name.push_back(nm);
bir.push_back(br);
tmp.year = (br[0]-'0')*1000+(br[1]-'0')*100+(br[2]-'0')*10+br[3]-'0';
tmp.month = (br[5]-'0')*10+br[6]-'0';
tmp.day = (br[8]-'0')*10+br[9]-'0';
if(tmp > dhigh || dlow > tmp) continue;
if(mind >= tmp) { mind = tmp; id1 = i; }
if(tmp >= maxd) { maxd = tmp; id2 = i; }
cnt++;
}
if(cnt > 0)
cout << cnt << " " << name[id1] << " " << name[id2] << endl;
else
cout << "0" << endl;
}
return 0;
}
1029 字串細節
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctype.h>
using namespace std;
char s1[82], s2[82];
bool alpha[27], dig[12], space;
int main() {
while(~scanf("%s", s1)) {
scanf("%s", s2);
memset(alpha, false, sizeof(alpha));
memset(dig, false, sizeof(dig));
space = false;
for(int i = 0; s2[i] != '\0'; i++) {
if(isdigit(s2[i])) {
dig[s2[i]-'0'] = true;
} else if(isalpha(s2[i])) {
if(s2[i]>='a' && s2[i]<='z') s2[i] += 'A'-'a';
alpha[s2[i]-'A'] = true;
} else if(s2[i] == '_') space = true;
}
for(int i = 0; s1[i] != '\0'; i++) {
if(isdigit(s1[i])) {
if(!dig[s1[i]-'0']) { printf("%c", s1[i]); dig[s1[i]-'0'] = true; }
} else if(isalpha(s1[i])) {
if(s1[i]>='a' && s1[i]<='z') s1[i] += 'A'-'a';
if(!alpha[s1[i]-'A']) { printf("%c", s1[i]); alpha[s1[i]-'A'] = true; }
} else if(s1[i] == '_') {
if(!space) { printf("_"); space = true; }
}
}
printf("\n");
}
return 0;
}
1030 排序,將不可以的一個個排除
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, p;
long long a[100010];
int main() {
while(~scanf("%d%d", &n, &p)) {
for(int i = 0; i < n; i++)
scanf("%lld", &a[i]);
sort(a, a+n);
int ans = 0, j = 0;
long long tmp = a[0]*p;
for(int i = 0; i < n; i++) {
while(j < i && tmp < a[i]) tmp = a[++j]*p;
if(ans < i-j+1) ans = i-j+1;
}
printf("%d\n", ans);
}
return 0;
}
相關推薦
PAT (Basic Level) Practise(中文)----30題解題報告
注:這裡涵蓋了PAT BASIC的全部30道題,難度較易,但還是為初學者做一個參考,最好自己想出思路,找出錯誤資料,程式碼僅供參考。 1001 注意統計砍一半的次數 #include <i
PAT乙級真題及訓練集 PAT (Basic Level) Practise (中文)1014. 福爾摩斯的約會
大偵探福爾摩斯接到一張奇怪的字條:“我們約會吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大偵探很快就明白了,字條上奇怪的亂碼實際上就是約會的時間“星期四 14:04”,因為前面兩字串中第1對相同的大寫英
PAT乙級真題及訓練集 PAT (Basic Level) Practise (中文)1013. 數素數
令Pi表示第i個素數。現任給兩個正整數M <= N <= 104,請輸出PM到PN的所有素數。 輸入格式: 輸入在一行中給出M和N,其間以空格分隔。 輸出格式: 輸出從PM到PN的所有素數,每10個數字佔1行,其間以空格分隔,但行末不得有多餘空格。
PAT乙級真題及訓練集 PAT (Basic Level) Practise (中文)1012. 數字分類
給定一系列正整數,請按要求對數字進行分類,並輸出以下5個數字:A1 = 能被5整除的數字中所有偶數的和;A2 = 將被5除後餘1的數字按給出順序進行交錯求和,即計算n1-n2+n3-n4...;A3 = 被5除後餘2的數字的個數;A4 = 被5除後餘3的數字的平均數,精確到小數點後1位;
PAT乙級真題及訓練集 PAT (Basic Level) Practise (中文)1011. A+B和C
給定區間[-231, 231]內的3個整數A、B和C,請判斷A+B是否大於C。 輸入格式: 輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每組佔一行,順序給出A、B和C。整數間以空格分隔。 輸出格式: 對每組測試用例,在一行中
PAT乙級真題及訓練集 PAT (Basic Level) Practise (中文)1010. 一元多項式求導
設計函式求一元多項式的導數。(注:xn(n為整數)的一階導數為n*xn-1。) 輸入格式:以指數遞降方式輸入多項式非零項係數和指數(絕對值均為不超過1000的整數)。數字間以空格分隔。 輸出格式:以與輸入相同的格式輸出導數多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多
PAT乙級真題全集-PAT (Basic Level) Practise (中文)
1001. 害死人不償命的(3n+1)猜想 (15) 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公佈了這
PAT (Basic Level) Practise (中文)練習(Java語言組)
1001. 害死人不償命的(3n+1)猜想 (15/15) 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公
PAT (Basic Level) Practise (中文)1008. 陣列元素迴圈右移問題 (20)
一個數組A中存有N(N>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移M(M>=0)個位置,即將A中的資料由(A0A1……AN-1)變換為(AN-M …… AN-1 A0 A1……AN-M-1)(最後M個數迴圈移至最前面的M個位置)。如果需要考慮程式移動資料的次數儘量少,要如何
PAT (Basic Level) Practise (中文) 1025. 反轉連結串列 (25)
1025. 反轉連結串列 (25) 時間限制 300 ms 記憶體限制 65536 kB 程式碼長度限制 8000 B 判題程式 Standard 作者 CHEN, Yue 給定一個常數K以及一個單鏈表L,請編寫程式將L中每K個結點反轉。
PAT (Basic Level) Practise (中文)1002. 寫出這個數 (20)
讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。 輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。 輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1 空格,但一行中最後一個拼音數字後沒有空格。 輸入樣例: 123456789098
PAT (Basic Level) Practise (中文)1015. 德才論(3種方法)
宋代史學家司馬光在《資治通鑑》中有一段著名的“德才論”:“是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。” 現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。 輸入格式: 輸入第1行給出3個正整數,分別為:
PAT (Basic Level) Practise (中文)1026. 程式執行時間
要獲得一個C語言程式的執行時間,常用的方法是呼叫標頭檔案time.h,其中提供了clock()函式,可以捕捉從程式開始執行到clock()被呼叫時所耗費的時間。這個時間單位是clock tick,即“時鐘打點”。同時還有一個常數CLK_TCK,給出了機器時鐘每秒所走的時鐘
PAT (Basic Level) Practise (中文) 1077. 互評成績計算 (20)
在浙大的計算機專業課中,經常有互評分組報告這個環節。一個組上臺介紹自己的工作,其他組在臺下為其表現評分。最後這個組的互評成績是這樣計算的:所有其他組的評分中,去掉一個最高分和一個最低分,剩下的分數取平均分記為 G1;老師給這個組的評分記為 G2。該組得分為 (G1+G2)/2,最後結果四捨五入後保留整數分
PAT (Basic Level) Practise (中文)1025. 反轉連結串列 (25)
給定一個常數K以及一個單鏈表L,請編寫程式將L中每K個結點反轉。例如:給定L為1→2→3→4→5→6,K為3,則輸出應該為3→2→1→6→5→4;如果K為4,則輸出應該為4→3→2→1→5→6,即最後不到K個元素不反轉。 輸入格式: 每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的地址、結
PAT (Basic Level) Practise水題1~10
call ++ 真的 evel -a namespace cal 多少 all 1001. 害死人不償命的(3n+1)猜想 (15) 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麽把它砍掉一半;如果它是奇數,那麽把(3n+1)砍掉一半。這樣一直反復砍
PAT(Basic Level)Practise-----1001
PAT(Basic Level)Practise—–1001. 害死人不償命的(3n+1)猜想 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步
PAT (Basic Level) Practice (中文)1001
1001 害死人不償命的(3n+1)猜想 (15 分) 卡拉茲(Callatz)猜想: 對任何一個正整數 n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把 (3n+1) 砍掉一半。這樣一直反
PAT (Basic Level) Practice (中文)1002
pla flow ati soft ali 輸出 pan 自然數 include 1002 寫出這個數 (20 分) 讀入一個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。 輸入格式: 每個測試輸入包含 1 個測試用例,即給出自然數 n 的值。這裏保證
PAT (Basic Level) Practice (中文)1005 繼續(3n+1)猜想 (25 分)_C語言實現
題目地址 題目解析:這裡我的處理方式有一定簡潔性,可供參考。 我的程式碼: #include<stdio.h> int main() { int n,aa[101]={0};//構建包含下標2-100的陣列(輸入的數字的範圍)記錄每次運算的情況 scanf