PTA甲级算法笔记:
A1042 洗牌器
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
const int n = 54;
int k;
cin >> k;
int start[ n+ 1], end[n + 1], next[n + 1];
char mp[5] = {'S','H','C','D','J'};
for (int j = 1; j <= n; j++) {
cin >> next[j];
} for (int i = 1; i <= n; i++) {
start[i] = i;
}
for (int m = 0; m < k; m++) {
for (int i = 1; i <=n; i++) {
end[next[i]] = start[i];
}
for (int j = 1; j <= n; j++) {
start[j] = end[j];
}
}
for (int i = 1; i <= n; i++) {
start[i]--;//1-13属于第一个
if (i != n) {
cout << mp[start[i] / 13] << (start[i] % 13 + 1) << " ";
}
else {
cout << mp[start[i] / 13] << (start[i] % 13 + 1);
}
}
return 0;
}
A1046A+B>C
重点是考虑正负溢出问题
#include
#include
using namespace std;
const int N = 10000;
int main() {
int n, query, left, right,sum=0;//1到1的总距离
int dis[N],a[N];//dis[i]存储第1个结点顺时针到第i个结点的下一个结点的距离
cin>>n;
for (int i = 1; i <= n;i++){
cin>>a[i];
sum += a[i];
dis[i] = sum;
}
cin>>query;
for (int i = 0; i < query; i++) {
cin>>left>>right;
if (left > right) swap(left, right);
int temp = dis[right - 1] - dis[left - 1];
cout<<min(temp, sum - temp)<<endl;
}
return 0;
}
A1065 A+B and C (64bit)
#include
#include
#include
using namespace std;
int main() {
int T=0,i=0;
long long A, B, C,ans; //long int -2的63次方到2的63次方,所以加和会发生溢出
scanf("%d", &T);
while(T–) {
i++;
scanf("%lld%lld%lld",&A,&B,&C);
ans = A + B;
if (A > 0 && B > 0 && ans < 0)
printf(“Case #%d: true\n”,i);
else if (A < 0 && B < 0 && ans >= 0)
printf(“Case #%d: false\n”, i);
else if (ans > C)
printf(“Case #%d: true\n”, i);
else printf(“Case #%d: false\n”, i);
}
return 0;
}
A1002 多项式求和
#include
#include
#include
using namespace std;
const int maxn = 1111;
int main() {
int k, p = 0;
int n = 0;
double e = 0;
int count = 0;
scanf("%d", &k);//第一个多项式非零项个数
double c[maxn] = { };
for (int i = 0; i < k; i++) {
scanf("%d %lf", &n, &e);
c[n] += e;
}
scanf("%d", &p);//第二个多项式非零项个数
for (int i = 0; i < p; i++) {
scanf("%d %lf", &n, &e);
c[n] += e;
}
for (int i = 0; i <maxn; i++) {
if (c[i] != 0)
count++;
}
printf("%d", count);
for (int i = maxn - 1; i >= 0; i–) {
if(c[i]!=0) printf(" %d %.1f",i, c[i]);
}
return 0;
}
A1011世界杯求最大收益
#include
#include
#include
using namespace std;
const int maxn = 100;
int main() {
int idx = 0;
double e=0.0,temp=0.0,ans=1.0;
char res[3] = { ‘W’,‘T’,‘L’ };
char res_m[3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
scanf_s("%lf", &e);
if (e > temp) {
temp = e;
idx = j;
}
}
res_m[i] = res[idx];
ans *= temp;
}
for (int i = 0; i < 3; i++) {
printf("%c ", res_m[i]);
}
printf("%.2f",(ans*0.65-1)*2);
return 0;
}
A1006最早开门,最晚锁门
#include
#include
using namespace std;
int main() {
int n, minn = INT_MAX, maxn = INT_MIN;
scanf("%d", &n);
string unlocked, locked;
for(int i = 0; i < n; i++) {
string t;
cin >> t;
int h1, m1, s1, h2, m2, s2;
scanf("%d:%d:%d %d:%d:%d", &h1, &m1, &s1, &h2, &m2, &s2);
int tempIn = h1 * 3600 + m1 * 60 + s1;
int tempOut = h2 * 3600 + m2 * 60 + s2;
if (tempIn < minn) {
minn = tempIn;
unlocked = t;
}
if (tempOut > maxn) {
maxn = tempOut;
locked = t;
}
}
cout << unlocked << " " << locked;
return 0;
}
2,利用string类型可以直接进行比较
#include
#include
using namespace std;
int main(){
string in=“23:59:59”,out=“00:00:00”,fname,lname;
int n;
cin>>n;
for(int i=0;i<n;i++){
string a,b,c;
cin>>a>>b>>c;
if(b<in) {in=b;fname=a;}
if(c>out){out=c;lname=a;}
}
cout<<fname<<" "<<lname;
return 0;
}