文章目录
- 1003 我要通过!(重点题)
- 1005 继续(3n+1)猜想
- 1007 素数对猜想
- 1008 数组元素循环右移问题
- 1009 说反话
- 1010 一元多项式求导
- 1012 数字分类
- 1013 数素数
- 1014 福尔摩斯的约会
- 1015 德才论(待定)
- 1017 A除以B(重点模板题)
- 1018 锤子剪刀布
- 1019 数字黑洞(重点)
- 1020 月饼
- 1022 D进制的A+B
- 1024 科学计数法(重点题)
- 1025 反转链表(微重点)
- 1026 程序运行时间
- 1028 人口普查
- 1029 旧键盘
- 1030 完美数列(重点)
- 1033 旧键盘打字
- 1034 有理数四则运算(重点题)
- --> 1035 插入与归并(重点题目)
- 1037 在霍格沃茨找零钱
- 1040 有几个PAT
- 1044 火星数字(重点题)
- ---> 1045 快速排序(重点题)
- 1048 数字加密(重点)
- ---> 1049 数列的片段和(重点)
- ---> 1050 螺旋矩阵(重点题)
- ---> 1051 复数乘法(重点)
- 1052 卖个萌
- ----> 1054 求平均值(重点题)
- 1055 集体照(二刷ac)
- 1058 选择题(麻烦题,二刷AC)
- 1059 C语言竞赛
- 1062 最简分数
- 1065 单身狗
- 1067 试密码(重点)
- 1068 万绿丛中一点红
- 1070 结绳(注意!)
- 1073 多选题常见计分法
- 1074 宇宙无敌加法器
- ---> 1075 链表元素分类(麻烦)
- ---> 1078 字符串压缩与解压
- 1079 延迟的回文数(有意思的)
- **将字符串倒置与原字符串比较看是否相等可知s是否为回文串**
- ----- 1080 MOOC期终成绩
- ---> 1085 PAT单位排行(二刷没AC)
- 1086 就不告诉你
- 1088 三人行
- -----> 1089 狼人杀-简单版(重点题)
- 1090 危险品装箱
- 1092 最好吃的月饼
- --> 1094 谷歌的招聘(范围)
- 1095 解码PAT准考证(复杂,没写)
- 1096 大美数
- 1097 矩阵行平移
- 1099 性感素数
- 1100 校庆
- 1101 B是A的多少倍
- 1102 教超冠军卷
- 1104 天长地久(二刷AC)
- 1105 链表合并(没ac)
- 1106 2019数列(特例)
- ---> 1109 擅长C(重点题)
- --> 1110 区块反转(小重点)
- 1111 对称日(二刷AC)
- -> 1113 钱串子的加法(小重点)
- 1115 裁判机(没写)
- 1118 如需挪车请致电
- ----> 1119 胖达与盆盆奶(重点题)
- 1123 舍入
1003 我要通过!(重点题)
(找规律)
- 只存在’P’, ‘A’, 'T’三种字符;
- ‘P’, 'T’只能出现一次并且按照该顺序先后出现;
- P&T之间不能没有A;
- T之后A的数量 = P之前A的数量 × P&T中间A的数量。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
string s;
cin >> n;
while(n--)
{
cin >> s;
int pos = 0 , count[3] = {0 , 0 , 0};
for(int i = 0 ; i < s.size() ; i++)
{
if(s[i] == 'A') count[pos]++;
else if(s[i] == 'P' && pos == 0) pos = 1;
else if(s[i] == 'T' && pos == 1) pos = 2;
else break;
}
if(pos == 2 && count[1] && count[2] == count[1] * count[0]) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
1005 继续(3n+1)猜想
#include <bits/stdc++.h>
using namespace std;
/*
记入每个出现的次数
并且记录需要判断的数,次数为1的就是目标数
*/
int main()
{
map<int , int> m;
int k;
cin >> k;
int q[k];
for(int i = 0 ; i < k ; i++)
{
int t;
cin >> t;
q[i] = t;
while(t != 1)
{
m[t]++;
if(t % 2 == 1) t = (3*t+1)/2;
else t /= 2;
}
}
vector<int> v;
for(int i = 0 ; i < k ; i++)
{
if(m[ q[i] ] == 1) v.push_back(q[i]);
}
sort(v.begin() , v.end() , [](int a , int b){return a > b;});
for(int i = 0 ; i < v.size() ; i++)
{
cout << v[i];
if(i != v.size()-1) cout << " ";
}
return 0;
}
1007 素数对猜想
埃氏筛法(重点)
const int N = 10010;
int primes[N] , cnt;
bool st[N];
/*
思想就是找到第一个没有被标记的数为素数,之后这个数的倍数全部标记为非素数。
*/
void fun(int n)
{
for(int i = 2 ; i <= n ; i++)
{
if(!st[i])
{
primes[ cnt++ ] = i;
for(int j = i * 2 ; j < n ; j += i) st[j] = true;
}
}
}
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int q[N];
int n;
int primes[N] , cnt;
bool st[N];
void fun(int n)
{
cnt = 0;
for(int i = 2 ; i <= n ; i++)
{
if(!st[i])
{
primes[ cnt ++ ] = i;
for(int j = i * 2 ; j < n ; j += i) st[j] = true;
}
}
}
int main()
{
cin >> n;
fun(n);
int ans = 0;
for(int i = 0 ; i < cnt ; i++)
{
for(int j = i+1 ; j < cnt ; j++)
{
if(primes[j] - primes[i] > 2) break;
if(primes[j] - primes[i] == 2) ans++;
}
}
cout << ans << endl;
return 0;
}
1008 数组元素循环右移问题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n , m;
cin >> n >> m;
vector<int> v;
for(int i = 0 ; i < n ; i++)
{
int t; cin >> t;
v.push_back(t);
}
m %= n;
//reverse(),作用范围是左闭右开
reverse(v.begin() , v.begin() + n - m);
reverse(v.begin() + n - m , v.end());
reverse(v.begin() , v.end());
for(int i = 0 ; i < n ; i++)
{
cout << v[i];
if(i != n-1) cout << " ";
}
return 0;
}
1009 说反话
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<string> v;
string s;
//一直输入
while(cin >> s)
{
v.push_back(s);
}
reverse(v.begin() , v.end());
for(int i = 0 ; i < v.size() ; i++)
{
cout << v[i];
if(i != v.size()-1) cout << " ";
}
return 0;
}
1010 一元多项式求导
不能想太复杂
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a , b;
cin >> a >> b;
if(b == 0)
{
cout << 0 << " " << 0;
return 0;
}
else cout << a*b << " " << b-1;
while(cin >> a >> b && b != 0)
{
cout << " " << a*b << " " << b-1;
}
return 0;
}
1012 数字分类
分类讨论!!!不要少了情况
#include <bits/stdc++.h>
using namespace std;
int n;
int A[6];
int main()
{
memset(A , 0 , sizeof(A));
cin >> n;
int num = 0;
bool flag = true;
bool f2 = false;
while(n--)
{
int t;
cin >> t;
if(t % 5 == 0 && t % 2 == 0) A[1] += t;
if(t % 5 == 1)
{
// A[2] 有可能结果是 0,应该输出 0。而不是 N
f2 = true;
if(flag)
{
A[2] += t;
flag = false;
}
else
{
A[2] -= t;
flag = true;
}
}
if(t % 5 == 2) A[3]++;
if(t % 5 == 3)
{
num++;
A[4] += t;
}
if(t % 5 == 4) A[5] = max(A[5] , t);
}
if(A[1] == 0) cout << "N ";
else cout << A[1] << " ";
if(A[2] == 0 && !f2) cout << "N ";
else cout << A[2] << " ";
if(A[3] == 0) cout << "N ";
else cout << A[3] << " ";
if(num == 0) cout << "N ";
else printf("%.1f " , (double)A[4] / num);
if(A[5] == 0) cout << "N";
else cout << A[5];
return 0;
}
1013 数素数
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7;
int p[N] , cnt = 1;
bool st[N];
void fun()
{
for(int i = 2 ; i <= N; i++)
{
if(!st[i])
{
p[cnt++] = i;
for(int j = 2 * i ; j <= N ; j += i) st[j] = true;
}
}
}
int main()
{
int m , n;
cin >> m >> n;
fun();
for(int i = m ; i <= n ; i++)
{
int tem = i - m + 1 ; //输出的第tem个素数
cout << p[i];
if(tem % 10 == 0) cout << endl;
else if(i != n) cout << " ";
}
return 0;
}
1014 福尔摩斯的约会
严格判断每种限制
- 星期的字符限制在 A~G
- 分钟的限制在 0~9 A~N
- 秒钟的限制是 a~z A~Z
#include <bits/stdc++.h>
using namespace std;
string a , b;
int flag;
string week[7] = {"MON" , "TUE" , "WED" , "THU" , "FRI" , "SAT" , "SUN"};
int main()
{
cin >> a >> b;
int i = 0;
int flag = 0;
while( i < a.size() && i < b.size())
{
if(a[i] == b[i])
{
if(flag == 0 && a[i] >= 'A' && a[i] <= 'G')
{
cout << week[a[i] - 'A'] << " ";
flag = 1;
}
else if(flag == 1 && ((a[i] >= 'A' && a[i] <= 'N') || (a[i] >= '0' && a[i] <= '9')))
{
if(a[i] >= 'A') cout << 9 + a[i] - 'A' + 1;
else cout << "0" << a[i]-'0';
break;
}
}
i++;
}
cout << ":";
cin >> a >> b;
i = 0;
while( i < a.size() && i < b.size())
{
if(a[i] == b[i] && ((a[i] >= 'a' && a[i] <= 'z')|| (a[i] >='A' && a[i] <= 'Z')))
{
if(i < 10) cout << "0" << i;
else cout << i;
}
i++;
}
return 0;
}
1015 德才论(待定)
分类排序设计 结构体里面设计class(分类级别)
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n , l , h;
struct info
{
int id;
int de_s , cai_s , sum;
int clas;
}stu[N];
bool cmp(info a , info b)
{
if(a.clas != b.clas) return a.clas < b.clas;
else if(a.sum != b.sum) return a.sum > b.sum;
else if(a.de_s != b.de_s) return a.de_s > b.de_s;
else return a.id < b.id;
}
int main()
{
cin >> n >> l >> h;
int cnt = n;
for(int i = 0 ; i < n ; i++)
{
int t1 , t2 , t3;
cin >> t1 >> t2 >> t3;
stu[i].id = t1;
stu[i].de_s = t2;
stu[i].cai_s = t3;
stu[i].sum = t2 + t3;
if(t2 < l || t3 < l)
{
stu[i].clas = 5;
cnt--;
}
else if(t2 >= h && t3 >= h) stu[i].clas = 1;
else if(t2 >= h && t3 < h) stu[i].clas = 2;
else if(t2 < h && t3 < h && t2 >= t3) stu[i].clas = 3;
else stu[i].clas = 4;
}
sort(stu , stu+n , cmp);
cout << cnt << endl;
for(int i = 0 ; i < cnt ; i ++)
{
cout << stu[i].id << " " << stu[i].de_s << " " << stu[i].cai_s << endl;
}
return 0;
}
1017 A除以B(重点模板题)
高精度除法!!!
#include <bits/stdc++.h>
using namespace std;
// 从高位-低位
vector<int> div(vector<int> A , int b , int &r)
{
vector<int> C;
r = 0;
for(int i = A.size()-1 ; i >= 0 ; i--)
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin() , C.end());
// C.size() > 1。因为答案可能是0,所以需要保留一个0
while(C.size() > 1 && C.back() == 0 ) C.pop_back();
return C;
}
int main()
{
string temp;
cin >> temp;
vector<int> A;
for(int i = temp.size()-1; i >= 0 ; i--) A.push_back(temp[i] - '0'); //高精度的数 存储顺序 低位-高位
int b , r;
cin >> b;
vector<int> C = div(A , b , r);
for(int i = C.size()-1 ; i >= 0 ; i--) cout << C[i];
cout << " " << r;
//整花活
//ostream_iterator<int> o_ite(cout);
//copy(c.rbegin() , c.rend() , o_ite);
return 0;
}
1018 锤子剪刀布
找数组最大元素某些条件的时候,可以只设定一个标记。
#include <bits/stdc++.h>
using namespace std;
int cmp(char a , char b) //对于a而言 1 赢 0平局 -1 输
{
if(a == b) return 0;
if(a == 'C')
{
if(b == 'J') return 1;
else return -1;
}
else if(a == 'J')
{
if(b == 'C') return -1;
else return 1;
}
else
{
if(b == 'C') return 1;
else return -1;
}
}
int main()
{
int n;
// 字母序排序,只有大于记录的次数才会覆盖。等于时,采用之前的,字母序也是较小的那个。
char q[3] = {'B' , 'C' , 'J'};
cin >> n;
char a , b;
int num[2][3]; // 赢平输 次数
int mp[2][3]; // 石头剪刀布 赢de次数
memset(num , 0 , sizeof(num));
memset(mp , 0 , sizeof(mp));
while(n--)
{
cin >> a >> b;
if(cmp(a , b) == 0)
{
num[0][1] ++;
num[1][1] ++;
}
else if(cmp(a , b) == 1)
{
num[0][0] ++;
num[1][2] ++;
for(int i = 0; i < 3; i++)
{
if(q[i] == a)
{
mp[0][i]++;
break;
}
}
}
else
{
num[0][2] ++;
num[1][0] ++;
for(int i = 0; i < 3; i++)
{
if(q[i] == b)
{
mp[1][i]++;
break;
}
}
}
}
int ta = 0 , tb = 0;
for(int i = 0 ; i < 2 ; i++)
{
for(int j = 0 ; j < 3 ; j++)
{
cout << num[i][j];
if(j < 2) cout << " ";
}
cout << endl;
}
for(int i = 0 ; i < 3 ; i++)
{
if(mp[0][i] > mp[0][ta]) ta = i;
if(mp[1][i] > mp[1][tb]) tb = i;
}
cout << q[ta] << " " << q[tb] << endl;
return 0;
}
1019 数字黑洞(重点)
模拟,数字操作!!!使用stoi,reverse会超时
保留4位数,printf(“%04d”, a );
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a , int b)
{
return a > b;
}
int main()
{
int a[4] = {0} , b , c , t;
cin >> t;
while(true)
{
a[0] = t / 1000;
a[1] = t / 100 % 10;
a[2] = t / 10 % 10;
a[3] = t % 10;
sort(a , a + 4 , cmp);
b = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
c = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0];
t = b - c;
// 显示4位
printf("%04d - %04d = %04d\n" , b , c ,t);
if(t == 6174 || t == 0) break;
}
return 0;
}
1020 月饼
结构体排序题,注意段错误一般是数组大小设置不当,以及结构体内的数据类型,涉及到除法尽量开double
#include <bits/stdc++.h>
using namespace std;
struct node
{
//测试点二,double类型
double num;
double money;
double price;
};
int main()
{
int n , d;
cin >> n >> d;
node q[n];
for(int i = 0 ; i < n ; i++)
{
cin >> q[i].num;
}
for(int i = 0 ; i < n ; i++)
{
cin >> q[i].money;
q[i].price = q[i].money / q[i].num;
}
sort(q , q + n , [](node a , node b){return a.price > b.price;});
double sum = 0.0;
for(int i = 0; i < n && d; i++)
{
if(q[i].num <= d)
{
d -= q[i].num;
sum += q[i].money;
}
else
{
sum += q[i].price * d;
break;
}
}
printf("%.2f" , sum);
return 0;
}
1022 D进制的A+B
案例特判 long long
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
void change(long long num , int D)
{
while(num)
{
v.push_back(num % D);
num /= D;
}
}
int main()
{
long long a , b ;
int d;
cin >> a >> b >> d;
//第四个案例特判
if(a + b == 0)
{
cout << 0;
return 0;
}
change(a + b , d);
for(int i = v.size()-1 ; i >= 0 ; i--) cout << v[i];
return 0;
}
1024 科学计数法(重点题)
朴素法
#include <bits/stdc++.h>
using namespace std;
int main()
{
char c;
cin >> c;
if(c == '-') cout << "-";
vector<char> v;
while((cin >> c) && c != 'E')
{
if(c >= '0' && c <= '9')
v.push_back(c);
}
int e;
cin >> e;
if(e < 0)
{
cout << "0.";
e = -e-1;
while(e--) cout << "0";
for(auto t : v) cout << t;
}
else
{
// 最多e+1位,[ 0 , e+1 )
for(int i = 0 ; i < v.size() || i < e+1 ; i++)
{
if(i == e+1) cout << ".";
if(i < v.size()) cout << v[i];
else cout << "0";
}
}
return 0;
}
非常优雅的处理小数点的位移问题!!!c1
#include<iostream>
#include<string>
using namespace std;
int main()
{
char h , a[10001]={0};
int i,e;
scanf("%c%c.%[0-9]E%d",&h,&a[0],a+1,&e);
if(h=='-')
printf("-");
if(e<0) //指数小于0的情况
{
printf("0.");
e=-e-1;
while(e)
{
printf("0");
e--;
}
printf("%s",a);
}
else //指数不小于0的情况
{ //小数点后移e位,e位前如果没有数值就补0,e位后如果没有数值了就不加小数点了
//a[i]!=0意思是是否到了 char[] 的末尾
for(i=0;i<=e||a[i]!=0;i++)
{
if(i==e+1) printf(".");
printf("%c",a[i]==0?'0':a[i]);
}
}
return 0;
}
朴素点的方法
#include <bits/stdc++.h>
using namespace std;
int main()
{
char h , t;
cin >> h;
if(h == '-') cout << h;
vector<char> v;
while((cin >> t) && t != 'E')
{
if(t >= '0' && t <= '9') v.push_back(t);
}
int e;
cin >> e;
if(e < 0)
{
cout << "0.";
e = -e-1;
while(e--)
cout << "0";
for(int i = 0 ; i < v.size() ; i++) cout << v[i];
}
else
{
for(int i = 0 ; i <= e || i < v.size() ; i++)
{
if(i == e + 1) cout << ".";
if(i < v.size()) cout << v[i];
else cout << "0";
}
}
return 0;
}
1025 反转链表(微重点)
vector记录链表顺序,next地址就是下一个节点的add
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
struct node
{
int add;
int data;
int next;
}q[N];
int main()
{
int first , n , k;
cin >> first >> n >> k;
while(n--)
{
int a , b , c;
cin >> a >> b >> c;
q[a].add = a;
q[a].data = b;
q[a].next = c;
}
vector<node> v; //存储正确的顺序
while(first != -1)
{
v.push_back(q[first]);
first = q[first].next;
}
for(int i = 0 ; i < (v.size()- v.size() % k) ; i += k)
{
reverse(v.begin() + i , v.begin() + i + k);
}
for(int i = 0; i < v.size() ; i++)
{
printf("%05d %d " , v[i].add , v[i].data);
if(i != v.size()-1) printf("%05d\n" , v[i+1].add);
else cout << "-1";
}
return 0;
}
1026 程序运行时间
添加0.5 实现四舍五入!
#include <bits/stdc++.h>
using namespace std;
int main()
{
int c1 ,c2;
cin >> c1 >> c2;
int ans = (c2 - c1 + 50) / 100;
printf("%02d:%02d:%02d" , ans/(3600) , ans % 3600 / 60 , ans % 60);
return 0;
}
1028 人口普查
麻烦了点
求最值,只需要记录最值信息 !小心段错误 !
#include <bits/stdc++.h>
using namespace std;
int n;
struct node
{
string name;
int year , mon , day;
};
bool cmp (node t1 , node t2)
{
if(t1.year != t2.year) return t1.year < t2.year;
if(t1.mon != t2.mon) return t1.mon < t2.mon;
if(t1.day != t2.day) return t1.day < t2.day;
}
int main()
{
cin >> n;
int cnt = 0;
string name;
string num;
int year , mon , day;
node n1{"" , 2015 , 0 , 0} , n2{"" , 1813 , 0 , 0} , t; //n1 存储最大 n2 存储最小
for(int i = 0 ; i < n ; i++)
{
cin >> name >> num;
year = (num[0]-'0')*1000 + (num[1]-'0')*100 + (num[2]-'0')*10 + (num[3]-'0');
mon = (num[5]-'0')*10 + (num[6]-'0');
day = (num[8]-'0')*10 + (num[9]-'0');
if(year > 2014 || year < 1814) continue;
if(year == 2014)
{
if(mon > 9) continue;
if(mon == 9)
{
if(day > 6) continue;
}
}
if(year == 1814)
{
if(mon < 9) continue;
if(mon == 9)
{
if(day < 6) continue;
}
}
cnt++;
t.name = name;
t.year = year;
t.mon = mon;
t.day = day;
if(cmp(t , n1)) n1 = t; // t更大
if(cmp(n2 , t)) n2 = t; // t更年轻
}
//可能没有人是合格的生日
if(cnt == 0) cout << 0;
else cout << cnt << " " << n1.name << " " << n2.name;
return 0;
}
1029 旧键盘
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s1 , s2;
getline(cin , s1);
getline(cin , s2);
vector<char> v;
int i = 0 , j = 0;
//双指针
while(i < s1.size())
{
if(s1[i] != s2[j])
{
char tar = s1[i];
if(tar >= 'a' && tar <= 'z') tar = toupper(tar);
if(find(v.begin() , v.end() , tar) == v.end()) v.push_back(tar);
}
else j++;
i++;
}
for(auto t : v) cout << t;
return 0;
}
1030 完美数列(重点)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
long long p;
cin >> n >> p;
long long q[n];
for(int i = 0; i< n ; i++) cin >> q[i];
sort(q , q + n);
int l = 0 , r = 0;
int ans = 0;
while(l <= r && r < n)
{
//m*p可能会越界,所以改用long long型。
if(q[r] <= q[l] * p) r++;
else l++;
//此时满足条件,但r指向的范围内的下一个点。所以是 r-l
ans = max((r - l) , ans);
}
cout << ans;
return 0;
}
1033 旧键盘打字
cin无法判断空行,使用 getline(cin,str)获取空行
注意题目表达
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<char> v;
string str;
getline(cin , str);
bool flag = false; // 如果有 + ,说明不能有大写字符
for(int i = 0 ; i < str.size() ; i++)
{
v.push_back(str[i]);
if(str[i] == '+') flag = true;
}
getline(cin , str);
for(int i = 0 ; i < str.size() ; i++)
{
char t = str[i] , w = t;
if(t >= 'A' && t <= 'Z' && flag) continue;
if(t >= 'a' && t <= 'z') w = toupper(t);
//不会超时
if( find(v.begin() , v.end() , w) == v.end() ) cout << t;
}
return 0;
}
1034 有理数四则运算(重点题)
思路很重要!
- 判断分子/分母 Inf ,0 的情况
- flag = 1 表示为负数,那么需要考虑括号
- 如果为负数,加上
(-
- m , n 取绝对值, x = m/n 整数部分,如果不为0,就添加
- 如果 m整除n,那么就没有分数部分 直接判断flag,是否添加
)
,并退出 - 还没退出,说明有分数部分,并且如果有整除部分,得加一个空格
- 分子减去整数部分的值
__gcd
分母的最大公倍数, 分子分母分别除以最大公倍数就是最简式- 最后判断flag,是否输出
)
#include <bits/stdc++.h>
using namespace std;
long long a, b, c, d;
void func(long long m, long long n) {
if (m * n == 0) {
printf("%s", n == 0 ? "Inf" : "0");
return ;
}
bool flag = ((m < 0 && n > 0) || (m > 0 && n < 0));
m = abs(m); n = abs(n);
long long x = m / n;
printf("%s", flag ? "(-" : "");
if (x != 0) printf("%lld", x);
if (m % n == 0) {
if(flag) printf(")");
return ;
}
if (x != 0) printf(" ");
m = m - x * n;
long long t = __gcd(m, n);
m = m / t; n = n / t;
printf("%lld/%lld%s", m, n, flag ? ")" : "");
}
int main() {
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
func(a, b); printf(" + "); func(c, d); printf(" = "); func(a * d + b * c, b * d); printf("\n");
func(a, b); printf(" - "); func(c, d); printf(" = "); func(a * d - b * c, b * d); printf("\n");
func(a, b); printf(" * "); func(c, d); printf(" = "); func(a * c, b * d); printf("\n");
func(a, b); printf(" / "); func(c, d); printf(" = "); func(a * d, b * c);
return 0;
}
–> 1035 插入与归并(重点题目)
插入的判断!
归并的模拟!
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
//插入操作是按顺序将队列逐渐变成有序的。
int n, a[100], b[100], i, j;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
cin >> b[i];
for (i = 0; i < n - 1 && b[i] <= b[i + 1]; i++);
for (j = i + 1; a[j] == b[j] && j < n; j++);
if (j == n) {
cout << "Insertion Sort" << endl;
sort(a, a + i + 2);
} else {
cout << "Merge Sort" << endl;
int k = 1, flag = 1;
while(flag) {
flag = 0;
for (i = 0; i < n; i++) {
if (a[i] != b[i])
flag = 1;
}
k = k * 2;
for (i = 0; i < n / k; i++)
sort(a + i * k, a + (i + 1) * k);
sort(a + n / k * k, a + n);
}
}
for (j = 0; j < n; j++) {
if (j != 0) printf(" ");
printf("%d", a[j]);
}
return 0;
}
1037 在霍格沃茨找零钱
统一单位运算
#include <iostream>
using namespace std;
int main()
{
int a , b , c;
scanf("%d.%d.%d" , &a , &b , &c);
long long sum1 = c + b * 29 + a * 29 * 17;
scanf("%d.%d.%d" , &a , &b , &c);
long long sum2 = c + b * 29 + a * 29 * 17;
if(sum1 > sum2) cout << "-";
long long ans = abs(sum1 - sum2);
cout << ans / (17 * 29) << "." << ans / 29 % 17 << "." << ans % 29;
return 0;
}
1040 有几个PAT
匹配(重点)
#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
int main()
{
int t = 0;
string str;
cin >> str;
int ans = 0;
vector<int> l , r;
for(int i = 0 ; i < str.size() ; i++)
{
if(str[i] == 'P') t++;
l.push_back(t);
}
t = 0;
//从右往左
for(int i = str.size()-1 ; i >= 0 ; i--)
{
if(str[i] == 'T') t++;
else if(str[i] == 'A')
{
ans += l[i] * t;
ans %= mod;
}
}
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
string str;
int main()
{
cin >> str;
int P = 0 , A = 0 , T = 0;
int ans = 0;
// 字符串中 T 的 总数
for(int i = 0 ; i < str.size() ; i++)
if(str[i] == 'T') T++;
for(int i = 0 ; i < str.size() ; i++)
{
if(str[i] == 'P') P++;
else if(str[i] == 'T') T--; //这样就能得到 A 右侧的 T 的个数!!!
else if(str[i] == 'A') ans += P * T , ans %= MOD;
}
cout << ans;
return 0;
}
1044 火星数字(重点题)
复杂 模拟题
- getchar() 吸掉换行 + getline(cin, t) 获取每一行的数据
- 通过t[0]判断是否是地球文(数字)
- stoi(t):字符串转化成int数值
- 关键在于:个位数如果是0,不会打印出来。因为十位是不同的标记,不需要个位的0
- tret需要特判
#include <bits/stdc++.h>
using namespace std;
int n;
string t;
string q2[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string q1[13] = {"xxx" , "tam" , "hel" , "maa" , "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
void fun1(int num)
{
/*
if(num / 13) cout << q1[num / 13];
if((num / 13) && (num % 13)) cout << " "; // 有高位,并且低位不为0 时候 低位需要输出
if(num % 13 || num == 0) cout << q2[num % 13];
*/
if(num / 13) //有高位
{
cout << q1[num / 13];
//重点
if(num % 13) cout << " " << q2[num % 13]; // 低位不等于0的时候,才输出
}
else cout << q2[num];
}
void fun2(string str)
{
if(str == "tret") //特判tret,因为下边的substr无法提取
{
cout << 0;
return;
}
int t1 = 0 , t2 = 0;
string s1 = str.substr(0 , 3) , s2;
/*
存在s2,正常查找,s1在q1找,s2在q2找。
不存在s2
s1需要分别在 q1,q2找。
因为存在 个位是0,不需要显示。
*/
if(str.size() > 4)
{
s2 = str.substr(4 , 3);
for(int i = 1 ; i < 13 ; i++)
{
if(q1[i] == s1) t1 = i;
if(q2[i] == s2) t2 = i;
}
cout << t1 * 13 + t2;
}
else
{
for(int i = 0 ; i < 13 ; i++)
{
if(q1[i] == s1)
{
cout << i * 13;
return;
}
if(q2[i] == s1)
{
cout << i;
return;
}
}
}
}
int main()
{
cin >> n;
getchar();//吸掉换行
while(n--)
{
getline(cin , t);
if(t[0] >= '0' && t[0] <= '9')
{
//地球文
fun1(stoi(t));
}
else
{
fun2(t);
}
if(n != 0) cout << endl;
}
return 0;
}
—> 1045 快速排序(重点题)
思路关键!!!
满足正确的排序位置,还得要大于之前的max
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n ;
int pre[N] , cnt[N];
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> pre[i];
cnt[i] = pre[i];
}
sort(pre , pre+n);
vector<int> v;
int max = 0; // 标记为 i 之前的最大值,当前的 cnt[i] 需要 满足位置不变 ,并且是 大于 max
for(int i = 0 ; i < n ; i++)
{
if(pre[i] == cnt[i] && cnt[i] > max )
v.push_back(cnt[i]);
if(cnt[i] > max)
max = cnt[i];
}
cout << v.size() << endl;
for(int i = 0 ; i < v.size() ; i++)
{
cout << v[i];
if(i < v.size()-1) cout << " ";
}
//测试点2:0时,需要输出空行!
cout << endl;
return 0;
}
1048 数字加密(重点)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string A , B , res;
cin >> A >> B;
//反转
reverse(A.begin() , A.end());
reverse(B.begin() , B.end());
//补充前导零 方便很多,不然每次还要判断下标范围
if(A.size() < B.size() ) A += string(B.size() - A.size() , '0');
else if(A.size() > B.size() ) B += string(A.size() - B.size() , '0');
int len = B.size();
for(int i = 0 ; i < len ; i++)
{
int a = A[i] - '0';
int b = B[i] - '0';
if(i % 2 == 1) // i=0 , 是第一位 奇数位。所以这里的奇偶处理需要交换。
{
int t = b - a;
if(t < 0) t += 10;
//int -> string
res += to_string(t) ;
}
else
{
int t = (a + b) % 13;
if(t == 10) res += 'J';
else if(t == 11) res += 'Q';
else if(t == 12) res += 'K';
else res += to_string(t) ;
}
}
reverse(res.begin() , res.end());
cout << res;
return 0;
}
—> 1049 数列的片段和(重点)
区间全排列求和,考虑左右边界的所有情况数量
分析:将数列中的每个数字读取到temp中,假设我们选取的片段中包括temp,且这个片段的首尾指针分别为p和q,那么对于p,有i种选择,即12…i,对于q,有n-i+1种选择,即i, i+1, … n,所以p和q组合形成的首尾片段有i * (n-i+1)种,因为每个里面都会出现temp,所以temp引起的总和为temp * i * (n – i + 1);遍历完所有数字,将每个temp引起的总和都累加到sum中,最后输出sum的值~
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int main()
{
long long ans = 0;
double temp = 0;
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
cin >> temp;
// 包含 temp 的区间,左区间有i种情况,1 2 3 ... i
// 右区间有,i i+1 i+2 ... n;
ans += (long long)(temp * 1000) * i * (n-i+1);
}
printf("%.2f" , ans / 1000.0);
return 0;
}
—> 1050 螺旋矩阵(重点题)
#include<bits/stdc++.h>
using namespace std;
int n;
bool cmp(int a , int b){return a > b;}
int main()
{
cin >> n;
int q[n+5];
for(int i = 0 ; i < n ; i++) cin >> q[i];
sort(q , q+n , cmp);
//求 t1 ,t2 行 列 :列较小,从sqrt(n)开始不断减小,可以保证 t2 较小
int t1 = 0, t2 = 0;
for(t2 = sqrt(n) ; t2 >= 1 ; t2--)
{
if(n % t2 == 0)
{
t1 = n / t2;
break;
}
}
int b[t1+5][t2+5];
//循环
//计算螺旋矩阵的层数level
//如果m的值为偶数,层数为m/2,如果m为奇数,层数为m/2+1
//所以level = m / 2 + m % 2;
int level = t1/2 + t1%2; //最关键点!!!
int cnt = 0;
for(int i = 0 ; i < level; i++)
{
// 保险:上下两层全部输出,左右两侧少两位输出
//细心分析,每两个循环的范围相互对应。
//先确定 b[][] 的行列哪个变 哪个不变,再确定变的下标范围。
for(int j = i ; j <= t2-i-1 && cnt < n; j++) b[i][j] = q[cnt++];
for(int j = i+1 ; j <= t1-2-i && cnt < n ; j++) b[j][t2-1-i] = q[cnt++];
for(int j = t2-i-1 ; j >= i && cnt < n ; j--) b[t1-1-i][j] = q[cnt++];
for(int j = t1-i-2 ; j >= i+1 && cnt < n ; j--) b[j][i] = q[cnt++];
}
for(int i = 0 ; i < t1 ; i++)
{
for(int j = 0 ; j < t2 ; j++)
{
cout << b[i][j];
if(j != t2-1) cout << " ";
}
cout << endl;
}
return 0;
}
—> 1051 复数乘法(重点)
浮点数接近0情况
**分析:当浮点数在 (-0.005 , +0.005)进行处理会得到 -0.00 和 0.00 **
#include<bits/stdc++.h>
using namespace std;
int main()
{
double r1 , p1 , r2 , p2;
cin >> r1 >> p1 >> r2 >> p2;
double r = r1 * r2 * (cos(p1) * cos(p2) - sin(p1) * sin(p2));
double p = r1 * r2 * (cos(p1) * sin(p2) + sin(p1) * cos(p2));
//r p 非常接近 0
if(r + 0.005 >= 0 && r < 0) cout << "0.00";
else printf("%.2f%" , r);
if(p >= 0) printf("+%.2fi" , p);
else if(p + 0.005 >= 0 && p < 0) cout << "+0.00i";
else printf("%.2fi" , p);
return 0;
}
1052 卖个萌
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector< vector<string> > vv;
for(int i = 0 ; i < 3 ; i ++)
{
vector<string> row;
row.push_back("");
string str;
getline(cin , str);
int l = 0;
while(l < str.size())
{
if(str[l] == '[')
{
int r = l+1;
while(str[r] != ']') r++;
string t = str.substr(l+1 , r - l - 1);
row.push_back(t);
}
l++;
}
vv.push_back(row);
}
int n ;
cin >> n;
while(n--)
{
int a , b , c , d , e;
cin >> a >> b >> c >> d >> e;
if(a >= vv[0].size() || b >= vv[1].size() || c >= vv[2].size() || d >= vv[1].size() || e >= vv[0].size()
|| a < 1 || b < 1 || c < 1 || d < 1 || e < 1)
{
cout << "Are you kidding me? @\\/@" << endl;
}
else
{
cout << vv[0][a] << "(" << vv[1][b] << vv[2][c] << vv[1][d] << ")" << vv[0][e] << endl;
}
}
return 0;
}
----> 1054 求平均值(重点题)
sscanf() sprintf()
分析:使用sscanf和sprintf函数~
sscanf() – 从一个字符串中读进与指定格式相符的数据
sprintf() – 字符串格式化命令,主要功能是把格式化的数据写入某个字符串中
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main() {
int n, cnt = 0;
char a[50], b[50];
double temp = 0.0, sum = 0.0;
cin >> n;
for(int i = 0; i < n; i++) {
scanf("%s", a);
sscanf(a, "%lf", &temp);
sprintf(b, "%.2f",temp);
int flag = 0;
for(int j = 0; j < strlen(a); j++)
if(a[j] != b[j]) flag = 1;
if(flag || temp < -1000 || temp > 1000) {
printf("ERROR: %s is not a legal number\n", a);
continue;
} else {
sum += temp;
cnt++;
}
}
if(cnt == 1)
printf("The average of 1 number is %.2f", sum);
else if(cnt > 1)
printf("The average of %d numbers is %.2f", cnt, sum / cnt);
else
printf("The average of 0 numbers is Undefined");
return 0;
}
1055 集体照(二刷ac)
简单的模拟实现起来很复杂,分部分找规律!!!
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
struct node
{
string name;
int h;
}q[N];
int main()
{
int n , k;
cin >> n >> k;
for(int i = 0 ; i < n ; i++)
{
cin >> q[i].name >> q[i].h;
}
sort(q , q + n , [](node n1 , node n2) -> bool
{return n1.h != n2.h ? n1.h > n2.h : n1.name < n2.name;});
int num;
int cnt = 0;
for(int i = 0 ; i < k; i++)
{
string res[n+5];
if(i == 0) num = n / k + n % k;
else num = n / k;
for(int j = num/2 + 1 , k = cnt ; j <= num && k < n ; j++ , k += 2)
res[j] = q[k].name;
for(int j = num/2 , k = cnt+1 ; j > 0 && k < n ; j-- , k +=2 )
res[j] = q[k].name;
cnt += num;
for(int j = 1 ; j <= num ; j++)
{
cout << res[j];
if(j != num) cout << " ";
}
if(i != k-1) cout << endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
struct node
{
string name;
int height;
};
bool cmp(node a , node b)
{
return a.height != b.height ? a.height > b.height : a.name < b.name;
}
int main()
{
int n , k;
cin >> n >> k;
vector<node> stu(n);
for(int i = 0 ; i < n ; i++)
cin >> stu[i].name >> stu[i].height;
sort(stu.begin() , stu.end() , cmp);
int m = 0 ,t = 0 , row = k; // t表示 stu[] 下标
while(row)
{
//当前行的元素个数
//if(row == k) m = n - n / k * (k-1);
if(row == k) m = n / k + n % k;
else m = n / k;
vector<string> ans(m);
ans[m/2] = stu[t].name;
//左边
int j = m/2-1;
for(int i = t + 1 ; i < t + m ; i += 2)
{
ans[j--] = stu[i].name;
}
//右边
j = m/2 + 1;
for(int i = t + 2 ; i < t + m ; i += 2)
{
ans[j++] = stu[i].name;
}
cout << ans[0];
for(int i = 1; i < m ; i++)
{
cout << " " << ans[i];
}
cout << endl;
t = t + m;
//前面会用到row去判断是否是第一排。
row--;
}
return 0;
}
1058 选择题(麻烦题,二刷AC)
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
struct node
{
int score;
int tot_num;
int ans_num;
int ans[5] = {0};
int wor = 0;
int index = 0;
}q[N];
int main()
{
int n , m;
cin >> n >> m;
for(int i = 0 ; i < m ; i++)
{
cin >> q[i].score >> q[i].tot_num >> q[i].ans_num;
q[i].index = i+1;
for(int j = 0 ; j < q[i].ans_num ; j++)
{
char c;
cin >> c;
q[i].ans[c - 'a'] = 1;
}
}
for(int i = 0 ; i < n ; i++)
{
int ans = 0;
for(int j = 0 ; j < m ; j++)
{
char c;
int num;
cin >> c;
if(c == '(')
{
cin >> num;
int yes = 0;
bool flag = false;
for(int k = 0 ; k < num ; k ++)
{
cin >> c;
if(q[j].ans[c - 'a'] == 0)
{
flag = true;
//break;
}
else
{
yes++;
}
}
if(yes == q[j].ans_num && !flag)
{
ans += q[j].score;
}
else q[j].wor++;
}
cin >> c;
}
cout << ans << endl;
}
int max_num = 0;
for(auto t : q)
{
max_num = max(max_num , t.wor);
}
if(max_num == 0) cout << "Too simple";
else
{
cout << max_num;
for(int i = 0 ; i < m ; i++)
{
if(q[i].wor == max_num)
cout << " " << q[i].index;
}
return 0;
}
}
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
const int M = 110;
struct node
{
int score;
int totle_num;
int yes_num;
vector<char> flag;
int wor = 0;//做错该题的人数
}q[M];
int main()
{
int manfen = 0;
int n , m;
cin >> n >> m;
for(int i = 0 ; i < m ; i++)
{
cin >> q[i].score >> q[i].totle_num >> q[i].yes_num;
for(int j = 0 ; j < q[i].yes_num ; j++)
{
char t;
cin >> t;
q[i].flag.push_back(t);
}
manfen += q[i].score;
}
for(int i = 0 ; i < n ; i++) // 人
{
int ans = 0; // 得分
scanf("\n");
//注意这里的 i,j 的表示
for(int j = 0 ; j < m ; j++)//题目
{
if(j != 0) scanf(" ");
int k;
scanf("(%d" , &k);
char c;
// if(q[j].yes_num != k) continue;//跳过这个题目
// 不能跳过,跳过的话,后面的输入就乱了。
vector<char> vc;
for(int l = 0 ; l < k ; l++)
{
char c;
scanf(" %c" , &c);
vc.push_back(c);
}
scanf(")");
//vector判断相等 ==
if(vc == q[j].flag) ans += q[j].score;
else q[j].wor++;
}
cout << ans << endl;
}
//不需要排序
// sort(q , q + m , cmp);
//取得最大错误。
int max_wor = 0;
for(int i = 0 ; i < m ; i++)
{
if(q[i].wor > max_wor)
{
max_wor = q[i].wor;
}
}
if(max_wor == 0) cout << "Too simple";
else
{
cout << max_wor;
//编号递增顺序输出,直接按顺序访问找符合最大错误量的
for(int i = 0 ; i < m ; i++)
{
if(q[i].wor == max_wor)
{
cout << " " << i+1;
}
}
}
return 0;
}
1059 C语言竞赛
#include <bits/stdc++.h>
using namespace std;
bool fun(int x)
{
if(x < 2) return false;
for(int i = 2 ; i < x ; i++)
{
if(x % i == 0) return false;
}
return true;
}
int main()
{
int n;
cin >> n;
map<int , int> m;
for(int i = 0 ; i < n ; i++)
{
int t;
cin >> t;
m[t] = i+1;
}
int k;
cin >> k;
for(int i = 0 ; i < k ; i++)
{
int t; cin >> t;
printf("%04d: " , t);
int index = m[t];
if(index == 0) cout << "Are you kidding?" << endl;
else if(index == -1) cout << "Checked" << endl;
else
{
if(index == 1) cout << "Mystery Award" << endl;
else if(fun(index)) cout << "Minion" << endl;
else cout << "Chocolate" << endl;
m[t] = -1; //-1标记为已经领取了
}
}
return 0;
}
1062 最简分数
区间左右边界!!!
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a , b , c , d , e;
scanf("%d/%d %d/%d %d", &a , &b , &c , &d ,&e);
vector<int> v;
//保证 a/b <= c/d
if(a * d > c * b)
{
swap(a , c);
swap(b , d);
}
for(int i = 1 ; i < e ; i++)
{
if(__gcd(i , e) == 1)
{
if(a * e < i * b && c * e > i * d)
{
v.push_back(i);
}
}
}
for(int i = 0 ; i < v.size() ; i++)
{
cout << v[i] << "/" << e;
if(i != v.size()-1) cout << " ";
}
return 0;
}
1065 单身狗
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int m[100010]; // 情侣
while(n--)
{
int a , b;
cin >> a >> b;
m[a] = b;
m[b] = a;
}
vector<int> v;
cin >> n;
for(int i = 0 ; i < n ; i++)
{
int a;
cin >> a;
v.push_back(a);
}
int cnt = 0;
vector<int> ans;
for(int i = 0 ; i < v.size() ; i++)
{
if(find(v.begin() , v.end() , m[ v[i] ]) == v.end())
{
cnt++;
ans.push_back(v[i]);
}
}
sort(ans.begin() , ans.end());
cout << cnt << endl;
for(int i = 0 ; i < cnt ; i++)
{
printf("%05d" , ans[i]);
if(i != cnt -1) cout << " ";
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int q[N]{-1}; // 下标和值是一对情侣的 ID 测试点1
bool s[N]; // 当前编号是否存在
int p[N]; //记录客人,遍历两边客人进行判断是否有没有情侣在场。
int main()
{
int n; cin >> n;
for(int i = 0 ; i < n ; i++)
{
int t1 , t2; cin >> t1 >> t2;
q[t1] = t2;
q[t2] = t1;
}
int m; cin >> m;
for(int i = 0 ; i < m ; i++)
{
int t; cin >> t;
s[t] = true;
p[i] = t;
}
vector<int> v;
for(int i = 0 ; i < m ; i++)
{
//没有伴侣 或者 伴侣不在
if(q[ p[i] ] == -1 || s[ q[ p[i] ] ] == false)
v.push_back(p[i]);
}
sort(v.begin() , v.end());
cout << v.size() << endl;
for(int i = 0 ; i < v.size() ; i++)
{
printf("%05d" , v[i]);
if(i != v.size()-1) cout << " ";
}
return 0;
}
1067 试密码(重点)
getchar(); while(getline(cin , t)){…}
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
int n;
cin >> str >> n;
string t;
int cnt = 0;
getchar();//吸换行
while(getline(cin , t)) //getline之间不需要吸换行,可以写在while()里面
{
//测试点 5 应该判断整个t == "#" , 而不是 t[0]
if(t == "#") break;
if(t != str)
{
//错误和账号锁定可能都要输出。
cnt++;
if(cnt <= n)
cout << "Wrong password: " << t << endl;
if(cnt == n)
{
cout<<"Account locked";
break;
}
}
if(t == str && cnt < n)
{
cout << "Welcome in";
return 0;
}
}
return 0;
}
1068 万绿丛中一点红
#include <bits/stdc++.h>
using namespace std;
vector< vector<int> > vec;
map<int , int> mmap;
int m , n , tol;
int dir[8][2] = {{1,1},{1,-1},{-1,1},{-1,-1},{0,1},{1,0},{0,-1},{-1,0}};
bool fun(int a , int b)
{
for(int i = 0 ; i < 8 ; i++)
{
int x = a + dir[i][0];
int y = b + dir[i][1];
//不要求x,y一定在范围内,因为a,b可能在边上。
if (x >= 0 && x < n && y >= 0 && y < m &&
abs(vec[a][b] - vec[x][y]) <= tol)
return false;
}
return true;
}
int main()
{
cin >> m >> n >> tol;
vec.resize(n , vector<int>(m));
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < m ; j++)
{
int t;
cin >> t;
vec[i][j] = t;
mmap[ vec[i][j] ]++;
}
}
int cnt = 0;
int x , y; //只记录一个坐标即可
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < m ; j++)
{
if(mmap[ vec[i][j] ] == 1 && fun(i , j))
{
cnt++;
x = i+1 , y = j+1;
}
}
}
if(cnt == 1)
{
printf("(%d, %d): %d" , y , x , vec[x-1][y-1]);
}
else if(cnt == 0)
cout << "Not Exist";
else cout << "Not Unique";
return 0;
}
1070 结绳(注意!)
printf(“%.0f”,num) 会四舍五入
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
int q[N];
int main()
{
int n; cin >> n;
for(int i = 0 ; i < n ; i++) cin >> q[i];
sort(q , q+n);
double cnt = q[0];
for(int i = 1 ; i < n ; i++)
{
cnt = (cnt + q[i]) * 1.0 / 2;
}
//测试点4要求输出为不大于结果的最大整数,直接使用(int)强制类型转换就解决了
//printf("%.0f",num)这样会四舍五入导致测试点4错误
//printf("%.0f" , cnt);
cout << (int)cnt;
return 0;
}
1073 多选题常见计分法
1074 宇宙无敌加法器
#include <bits/stdc++.h>
using namespace std;
vector<int> per;
vector<int> add(vector<int> a , vector<int> b)
{
vector<int> c;
int temp = 0;
for(int i = 0 ; i < a.size() || i < b.size(); i++)
{
if( i < a.size()) temp += a[i];
if( i < b.size()) temp += b[i];
int mod = per[i];
if(per[i] == 0) mod = 10;
c.push_back(temp % mod);
temp /= mod;
}
if(temp) c.push_back(1);
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
int main()
{
string str;
cin >> str;
for(int i = str.size()-1 ; i >= 0 ; i--) per.push_back(str[i]-'0');
vector<int> a , b;
cin >> str;
for(int i = str.size()-1 ; i >= 0 ; i--) a.push_back(str[i]-'0');
cin >> str;
for(int i = str.size()-1 ; i >= 0 ; i--) b.push_back(str[i]-'0');
auto c = add(a , b);
for(int i = c.size()-1 ; i >= 0 ; i--) cout << c[i];
return 0;
}
类似高精度加法,注意最后一位进位还有的时候,多添加一位1
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int> a , vector<int> b , vector<int> s)
{
vector<int> c;
int t = 0;
for(int i = 0 ; i < a.size() || i < b.size() ; i++)
{
int sum = t;
if(i < a.size()) sum += a[i];
if(i < b.size()) sum += b[i];
int tem = s[i]; //进制
if(s[i] == 0)
{
tem = 10;
}
t = sum / tem;
c.push_back(sum % tem);
}
if(t) c.push_back(1);
return c;
}
int main()
{
string str , s1 , s2;
cin >> str >> s1 >> s2;
vector<int> a , b , s;
//不要写错了
for(int i = str.size()-1 ; i >= 0 ; i--) s.push_back(str[i] - '0');
for(int i = s1.size()-1 ; i >= 0 ; i--) a.push_back(s1[i] - '0');
for(int i = s2.size()-1 ; i >= 0 ; i--) b.push_back(s2[i] - '0');
auto c = add(a , b , s);
int k = c.size()-1;
//跳过前导0
while(k >= 0 && c[k--] == 0);
for(int i = k+1 ; i >= 0 ; i--) cout << c[i];
return 0;
}
—> 1075 链表元素分类(麻烦)
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
int d[N];
int n[N];
int main()
{
int first , num , k;
cin >> first >> num >> k;
for(int i = 0 ; i < num ; i++)
{
int ad , da , ne;
cin >> ad >> da >> ne;
d[ad] = da;
n[ad] = ne;
}
int cnt = first;
vector<int> v[3];
while(cnt != -1)
{
if(d[cnt] < 0) v[0].push_back(cnt);
else if(d[cnt] >= 0 && d[cnt] <= k) v[1].push_back(cnt);
else v[2].push_back(cnt);
cnt = n[cnt];
}
//如果输出方式不当容易出现段错误,不一定下一个 vector 有数据
bool flag = true;
for(int i = 0 ; i < 3 ; i++)
{
for(int j = 0 ; j < v[i].size() ; j++)
{
if(flag)
{
printf("%05d %d " , v[i][j] , d[ v[i][j] ]);
flag = false;
}
else printf("%05d\n%05d %d " , v[i][j] , v[i][j] , d[ v[i][j] ]);
}
}
cout << "-1";
return 0;
}
—> 1078 字符串压缩与解压
结尾处理!!!
#include<bits/stdc++.h>
using namespace std;
int main()
{
char t;
string str , num;
cin >> t;
getchar();
getline(cin , str);
int cnt = 1;
if(t == 'D')
{
for(int i = 0 ; i < str.length() ; i ++)
{
if(str[i] >= '0' && str[i] <= '9')
{
num += str[i];
}
else
{
if(num.length() > 0) cnt = stoi(num);
while(cnt--) cout << str[i];
cnt = 1;
num = "";
}
}
}else if(t == 'C')
{
char pre = str[0];
for(int i = 1 ; i < str.length() ; i++)
{
if(str[i] == pre)
{
cnt ++;
}
else
{
if(cnt >= 2) cout << cnt;
cout << pre;
cnt = 1;
pre = str[i];
}
}
// 最后一个测试案例
//最后结尾不会出现前后不一情况,无法翻译。
//结尾处理
if(cnt >= 2) cout << cnt;
cout << pre;
}
return 0;
}
1079 延迟的回文数(有意思的)
高精度加法 + 翻转reverse
将字符串倒置与原字符串比较看是否相等可知s是否为回文串
#include <iostream>
#include <algorithm>
using namespace std;
string rev(string s) {
reverse(s.begin(), s.end());
return s;
}
string add(string s1, string s2) {
string s = s1;
int carry = 0;
for (int i = s1.size() - 1; i >= 0; i--) {
s[i] = (s1[i] - '0' + s2[i] - '0' + carry) % 10 + '0';
carry = (s1[i] - '0' + s2[i] - '0' + carry) / 10;
}
if (carry > 0) s = "1" + s;
return s;
}
int main() {
string s, sum;
int n = 10;
cin >> s;
if (s == rev(s)) {
cout << s << " is a palindromic number.\n";
return 0;
}
while (n--) {
//stoi会超时。
sum = add(s, rev(s));
cout << s << " + " << rev(s) << " = " << sum << endl;
if (sum == rev(sum)) {
cout << sum << " is a palindromic number.\n";
return 0;
}
s = sum;
}
cout << "Not found in 10 iterations.\n";
return 0;
}
----- 1080 MOOC期终成绩
当为0时表示该学生的姓名在v中不存在
map[string] = cnt++;
#include<bits/stdc++.h>
using namespace std;
const int N = 30010;
struct node
{
string id;
int gp = -1;
int mt = -1;
int f = -1;
int score = 0;
}q[N];
/*
用map映射保存名字所对应v中的下标
(为了避免与“不存在”混淆,保存下标+1,当为0时表示该学生的姓名在v中不存在)
*/
map<string , int > mi;
int score(node t)
{
if(t.mt > t.f) return (int)(t.mt * 0.4 + t.f * 0.6 + 0.5);
else return t.f;
}
bool cmp(node n1 , node n2)
{
return n1.score != n2.score ? (n1.score > n2.score) : (n1.id < n2.id);
}
int main()
{
int p , m , n;
cin >> p >> m >> n;
int cnt = 1; // cnt 0 保存用于判断
for(int i = 0 ; i < p ; i++)
{
string a; int b;
cin >> a >> b;
if(b < 200) continue;
q[cnt].id = a;
q[cnt].gp = b;
mi[a] = cnt++;
}
for(int i = 0 ; i < m ; i++)
{
string a; int b;
cin >> a >> b;
//重点:mi[a] == 0 意味着 当前id的同学没有编程作业分或者是不不足200分。
if(mi[a] != 0)
{
q[ mi[a] ].mt = b;
}
}
for(int i = 0 ; i < n ; i++)
{
string a; int b;
cin >> a >> b;
if(mi[a] != 0)
{
q[ mi[a] ].f = b;
}
}
for(int i = 0; i < cnt; i ++)
q[i].score = score(q[i]);
sort(q , q + cnt , cmp);
for(int i = 0; i < cnt; i ++)
{
if(q[i].gp >= 200 && q[i].score >= 60)
{
cout << q[i].id << " " << q[i].gp << " " << q[i].mt
<< " " << q[i].f << " " << q[i].score << endl;
}
}
return 0;
}
—> 1085 PAT单位排行(二刷没AC)
不难,就是比较费时间
字符串大小写转换
transform(x.begin() , x.end() , x.begin() , ::tolower);
transform(x.begin() , x.end() , x.begin() , ::toupper);
hash表
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
struct node
{
int Bs = 0, As = 0, Ts = 0;
string school;
int totle = 0;
int count = 0;
}q[N];
bool cmp(node a , node b) {
if(a.totle != b.totle)
return a.totle > b.totle;
if(a.count != b.count)
return a.count < b.count;
return a.school < b.school;
}
int main()
{
int n;
int cnt = 0;//下标
// hash表存储 键值对
map<string , int> msi; // <学校,下标>
cin >> n;
while(n--)
{
string id , school ;
int score;
cin >> id >> score >> school;
transform(school.begin() , school.end() , school.begin() , ::tolower);
auto it = msi.find(school);
if(it != msi.end())
{
int idx = it->second;
if(id[0] == 'B') q[idx].Bs += score;
else if(id[0] == 'T') q[idx].Ts += score;
else if(id[0] == 'A') q[idx].As += score;
q[idx].count++;
}
else
{
msi.insert({school , cnt});
q[cnt].school = school;
if(id[0] == 'B') q[cnt].Bs += score;
else if(id[0] == 'T') q[cnt].Ts += score;
else if(id[0] == 'A') q[cnt].As += score;
q[cnt].count ++;
cnt++;
}
}
for(int i = 0 ; i < cnt ; i ++)
// 不需要四舍五入
q[i].totle = (int)(q[i].Bs * 1.0 / 1.5 + q[i].As * 1.0 + q[i].Ts * 1.5 );
sort(q , q + cnt , cmp);
cout << cnt << endl;
int xx = 1;
for(int i = 0 ; i < cnt ; i++)
{
// 并列排名的设计
if(i > 0 && q[i].totle == q[i-1].totle) cout << xx;
else {
cout << i+1;
xx = i+1;
}
cout << " " << q[i].school << " " << q[i].totle << " " << q[i].count;
if(i != cnt-1) cout << endl;
}
return 0;
}
1086 就不告诉你
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a , b;
cin >> a >> b;
int t = a * b;
string ans = to_string(t);
reverse(ans.begin() , ans.end());
// 消除前导零
cout << stoi(ans);
return 0;
}
1088 三人行
double!
#include<bits/stdc++.h>
using namespace std;
//函数形参也得是double
string cmp(double a , double b)
{
if(a == b) return " Ping";
else if(a > b) return " Cong";
else return " Gai";
}
int main()
{
int m , x , y;
cin >> m >> x >> y;
int t1 = 0, t2 = 0;
//丙的分数可能是浮点数。
double t3 = 0.0;
bool f = false;
for(int i = 99 ; i >= 10 ; i--)
{
t1 = i;
t2 = i % 10 * 10 + i/10;
t3 = abs(t2 - t1) * 1.0 / x;
if(t2 == double(t3 * y) ) {
f = true;
break;
}
}
if(f) cout << t1 << cmp(t1 , m) << cmp(t2 , m) << cmp(t3 , m);
else cout << "No Solution";
return 0;
}
-----> 1089 狼人杀-简单版(重点题)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
//每个人说的话,的标记是从1开始的
vector<int> v(n+1);
for(int i = 1 ;i <= n ; i++)
{
cin >> v[i];
}
for(int i = 1 ; i <= n ; i++)
{
for(int j = i+1 ; j <= n ; j++)
{
vector<int> lie , a(n+1 , 1);
a[i] = a[j] = -1;
for(int k = 1 ; k <= n ; k++)
{
if(v[k] * a[ abs(v[k]) ] < 0) lie.push_back(k);
}
if(lie.size() == 2 && a[ lie[0] ] + a[ lie[1] ] == 0)
{
cout << i << " " << j ;
return 0;
}
}
}
cout << "No Solution";
return 0;
}
1090 危险品装箱
不难,注意一个物品可能不能和多个物品放一起
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n , m;
cin >> n >> m;
map<int , vector<int> > mmap;
while(n--)
{
int a , b;
cin >> a >> b;
mmap[a].push_back(b);
mmap[b].push_back(a);
}
while(m--)
{
int k;
cin >> k;
bool f = false;
vector<int> tem(k);
for(int i = 0 ; i < k ; i++)
{
cin >> tem[i];
}
for(int i = 0 ; i < k ; i++)
{
auto vec = mmap[ tem[i] ];
for(int i = 0 ; i < vec.size() ; i++)
{
if( find(tem.begin() , tem.end() , vec[i]) != tem.end())
{
f = true;
break;
}
}
}
if(f) cout << "No" << endl;
else cout << "Yes" << endl;
}
return 0;
}
1092 最好吃的月饼
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
struct node
{
int score;
}q[N];
int main()
{
int n , m;
cin >> n >> m;
int max_score = 0;
while(m--)
{
for(int i = 0 ; i < n ; i++)
{
int s; cin >> s;
q[i].score += s;
// max_score 是 总的销量
max_score = max(max_score , q[i].score);
}
}
cout << max_score << endl;
//按照升序输出就这样写!~!!
vector<int> vi;
for(int i = 0 ; i < n ; i++)
{
if(q[i].score == max_score) vi.push_back(i+1);
}
for(int i = 0 ; i < vi.size() ; i++)
{
if(i != 0) cout << " ";
cout << vi[i];
}
return 0;
}
–> 1094 谷歌的招聘(范围)
#include<bits/stdc++.h>
using namespace std;
bool fun(int t)
{
if(t == 0 || t == 1) return false;
if(t == 2) return true;
for(int i = 2 ; i * i <= t ; i++)
{
if(t % i == 0)
return false;
}
return true;
}
int main()
{
int l , k;
string n;
cin >> l >> k >> n;
// l-k 范围
for(int i = 0 ; i <= l-k ; i++)
{
string temp = n.substr(i , k);
int t = stoi(temp);
if(fun(t))
{
//测试点2:应该输出字符串
cout << temp;
return 0;
}
}
cout << "404";
return 0;
}
1095 解码PAT准考证(复杂,没写)
1096 大美数
a整除b —> b%a == 0
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<string> v;
while(n--)
{
int t;
cin >> t;
vector<int> v2;
int sum = 0;
bool f = false;
for(int i = 1 ; i <= t; i++)
if(t % i == 0)
v2.push_back(i);
for(int i = 0 ; i < v2.size() ; i++)
for(int j = i+1 ; j < v2.size() ; j++)
for(int z = j+1 ; z < v2.size() ; z++)
for(int k = z+1 ; k < v2.size() ; k++)
// N 整除 和 -----> 之和 % N == 0
if((v2[i] + v2[j] + v2[z] + v2[k]) % t == 0)
{
f = true;
break;
}
if(f) v.push_back("Yes");
else v.push_back("No");
}
for(auto t : v)
{
cout << t << endl;
}
return 0;
}
1097 矩阵行平移
(二刷AC)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n , k , x;
cin >> n >> k >> x;
int m[n+10][n+10];
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= n ; j++)
cin >> m[i][j];
int cnt = 1;
for(int i = 1 ; i <= n ; i++)
{
if(i % 2 == 1)
{
if(cnt > k) cnt = 1;
int t = cnt;
while(t--)
{
//从末尾开始平移 (注意点)
for(int j = n ; j >= 2 ; j--)
{
m[i][j] = m[i][j-1];
}
}
for(int j = 1 ; j <= cnt ; j++)
{
m[i][j] = x;
}
cnt++;
}
}
for(int j = 1 ; j <= n ; j++)
{
int sum = 0;
for(int i = 1 ; i <= n ; i++)
{
sum += m[i][j];
}
cout << sum;
if(j != n) cout << " ";
}
return 0;
}
1099 性感素数
#include <bits/stdc++.h>
using namespace std;
bool fun(int x)
{
if(x < 2) return false;
for(int i = 2 ; i * i <= x ; i++)
{
if(x % i == 0)
return false;
}
return true;
}
int main()
{
int n;
cin >> n;
if(fun(n) && fun(n-6)) cout << "Yes" << endl << n-6;
else if(fun(n) && fun(n+6)) cout << "Yes" << endl << n-6;
else
{
cout << "No" << endl;
while(++n)
{
if((fun(n) && fun(n-6)) || (fun(n) && fun(n+6)))
{
cout << n << endl;
return 0;
}
}
}
return 0;
}
1100 校庆
set count()
用vector find 会超时
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
set<string> s1;
string old = "";
while(n--)
{
string tem;
cin >> tem;
s1.insert(tem);
if(old == "") old = tem;
else if(tem.substr(6 , 8) < old.substr(6 , 8))
{
old = tem;
}
}
int num = 0;
cin >> n;
string old2 = "";
while(n--)
{
string tem;
cin >> tem;
//都可以,建议常用set
//vector 的 find 会比较慢。
//if(s1.find(tem) != s1.end()) num++;
if(s1.count(tem)) num++;
else
{
if(old2 == "") old2 = tem;
else if(tem.substr(6 , 8) < old2.substr(6 , 8))
{
old2 = tem;
}
}
}
cout << num << endl;
if(num) cout << old;
else cout << old2;
return 0;
}
1101 B是A的多少倍
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a , d;
cin >> a >> d;
int mod = pow(10 , d);
int t = 1;
if(a / mod != 0)
t = pow(10 , to_string(a / mod).size());
double b = a % mod * t + a / mod;
double ans = b / a;
printf("%.2f" , ans);
return 0;
}
1102 教超冠军卷
销量为0,也可能是冠军
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string str1 , str2;
//可能销量为0,也是冠军
int num1 = -1, num2 = -1;
while(n--)
{
string s;
int n1 , n2;
cin >> s >> n1 >> n2;
if(num1 < n2)
{
num1 = n2;
str1 = s;
}
if(num2 < n2 * n1)
{
num2 = n2 * n1;
str2 = s;
}
}
cout << str1 << " " << num1 << endl;
cout << str2 << " " << num2;
return 0;
}
1104 天长地久(二刷AC)
存在超时,通过打表找规律
由打表观察可得,所有天长地久数最后两位为”99″,那么将末尾的两个’9’隐藏后可直接带入暴力循环判断。将所有可能答案存储后排序输出即可~
#include <bits/stdc++.h>
using namespace std;
bool fun(int x)
{
if(x <= 2) return false;
for(int i = 2 ; i * i <= x ; i++)
{
if(x % i == 0) return false;
}
return true;
}
struct node
{
int N;
int A;
};
int main()
{
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
int k , m;
cin >> k >> m;
//后两位一定是99
cout << "Case " << i << endl;
k -= 2;
int l = pow(10 , k-1) , r = pow(10 , k)-1;
vector<node> v;
for(int j = l ; j <= r ; j++)
{
int a = j , b = j+1;
int t1 = 18, t2 = 0;
while(a)
{
t1 += a % 10;
a /= 10;
}
if(t1 != m) continue;
while(b)
{
t2 += b % 10;
b /= 10;
}
if(fun(__gcd(t1 , t2)))
{
node tem;
tem.N = t2 , tem.A = j;
v.push_back(tem);
}
}
if(v.size())
{
sort(v.begin() , v.end() , [](node a , node b) -> bool{
if(a.N != b.N) return a.N < b.N;
return a.A < b.A;
});
for(auto t : v)
{
cout << t.N << " " << t.A << "99" << endl;
}
}
else
{
cout << "No Solution" << endl;
}
}
return 0;
}
1105 链表合并(没ac)
1106 2019数列(特例)
n <= 4 情况。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string str = "2019";
if(n <= 4)
{
cout << ans.substr(0 , n);
return 0;
}//必须加上前面三个判断,才能通过第二个一分的测试点
int sum = 12;
n -= 4;
for(int i = 0 ; i < n ; i++)
{
str += (sum%10 + '0');
sum += sum % 10;
sum -= str[i]-'0';
}
cout<< str;
return 0;
}
—> 1109 擅长C(重点题)
分析:三维数组a中储存26个字母对应的图形矩阵,out中储存每行要输出的图形矩阵,同时初始化out所有元素为空格。字符串中可能存在乱七八糟的字符,所以用getline做句子的输入。句子的单词间以任何非大写字母分隔,用while循环遍历找到下标j为非大写字母所在下标,i为当前单词首下标,然后根据单词中每一个字母,将输出图形记录到out中,最后输出out数组flag用来标记之前是否输出过一个单词,如果输出过,flag=1,则当再次需要输出单词之前需要先输出一个’\n’
#include <bits/stdc++.h>
using namespace std;
//三维数组存26个字母
//用二维数组,存单词字母!
char a[26][7][5] , out[7][100];
int main()
{
for(int i = 0 ; i < 26 ; i++)
for(int j = 0 ; j < 7 ; j++)
for(int k = 0 ; k < 5 ; k++)
cin >> a[i][j][k];
getchar();
string str;
getline(cin , str);
int flag = 0;
for(int i = 0; i < str.size() ; i++)
{
if(!(str[i] >= 'A' && str[i] <= 'Z')) continue;
int j = i;
while(j < str.size() && str[j] >= 'A' && str[j] <= 'Z') j++;
for(int k = i ; k < j ; k ++)
{
for(int x = 0 ; x < 7 ; x++)
{
for(int y = 0 ; y < 5 ; y++)
{
out[x][y + (k - i) * 5] = a[ str[k] - 'A'][x][y];
}
}
}
//不是第一个单词,就换行
if(flag == 1) cout << endl;
for(int x = 0 ; x < 7 ; x++)
{
for(int y = 0 ; y < (j-i)*5 ; y++)
{
cout << out[x][y];
flag = 1;
if(y % 5 == 4 && y != (j-i)*5-1) cout << " ";
}
cout << endl;
}
i = j;
}
return 0;
}
–> 1110 区块反转(小重点)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int frist , n , k;
cin >> frist >> n >> k;
int data[100010];
int ne[100010];
while(n--)
{
int a , b , c;
cin >> a >> b >> c;
data[a] = b;
ne[a] = c;
}
vector<int> v;
while(1)
{
v.push_back(frist);
frist = ne[frist];
if(frist == -1) break;
}
for(int i = 0 ; i < v.size() ; i += k)
{
//这样写不会卡 2、5测试
reverse(v.begin() + i , min(v.begin() + i + k , v.end() ) );
}
for(int i = v.size()-1 ; i > 0 ; i--)
{
printf("%05d %d %05d\n" , v[i] , data[v[i]] , v[i-1]);
}
printf("%05d %d -1" , v[0] , data[v[0]]);
return 0;
}
1111 对称日(二刷AC)
#include <bits/stdc++.h>
using namespace std;
string rev(string t)
{
reverse(t.begin() , t.end());
return t;
}
map<string , string> mmap = {{"Jan" , "01"} , {"Feb" , "02"} , {"Mar" , "03"} ,
{"Apr" , "04"} , {"May" , "05"} , {"Jun" , "06"} , {"Jul" , "07"} , {"Aug" , "08"},
{"Sep" , "09"} , {"Oct" , "10"} , {"Nov" , "11"} , {"Dec" , "12"}};
int main()
{
int n ;
cin >> n;
while(n--)
{
string str , day , year;
cin >> str >> day >> year;
if(day.size() == 2) day = "0" + day;
while(year.size() < 4) year = "0" + year;
string tot = year + mmap[str] + day[0] + day[1];
if(tot == rev(tot))
{
cout << "Y " << tot << endl;
}
else cout << "N " << tot << endl;
}
return 0;
}
-> 1113 钱串子的加法(小重点)
#include<bits/stdc++.h>
using namespace std;
vector<char> add( vector<char> A , vector<char> B)
{
vector<char> C;
int temp = 0;
for(int i = 0 ; i < A.size() || i < B.size() ; i++)
{
if(i < A.size())
{
if(A[i] >= '0' && A[i] <= '9') temp += A[i]-'0';
else temp += (A[i]-'a') + 10;
}
if(i < B.size())
{
if(B[i] >= '0' && B[i] <= '9') temp += B[i]-'0';
else temp += (B[i]-'a') + 10;
}
int t = temp % 30;
if(t >= 0 && t <= 9) C.push_back((char)(t + '0'));
else C.push_back((char)(t - 10 + 'a'));
temp /= 30;
}
if(temp) C.push_back('1');
// 去掉前导0 : 测试点3
// 当只有一位0的时候特殊情况:测试点4
while(C.size() > 1 && C.back() == '0') C.pop_back();
return C;
}
int main()
{
string s1 , s2;
cin >> s1 >> s2;
vector<char> v1 ,v2;
for(int i = s1.size()-1 ; i >= 0 ; i--) v1.push_back(s1[i]);
for(int i = s2.size()-1 ; i >= 0 ; i--) v2.push_back(s2[i]);
auto ans = add(v1, v2);
for(int i = ans.size()-1 ; i >= 0 ; i--) cout << ans[i];
return 0;
}
1115 裁判机(没写)
1118 如需挪车请致电
麻烦了点,但是不难。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n = 11;
string number = "0123456789";
string work = "+-*/%";
string s1 = "sqrt";
string s2 = "^";
string s3[10] = {"ling" , "yi" , "er" , "san" , "si" , "wu" , "liu" , "qi" , "ba" , "jiu"};
while(n--)
{
bool flag = true;
string s;
getline(cin , s);
int p = 0;
if( ( p = s.find(s1) ) != string::npos)
{
int t = sqrt( stoi( s.substr(p+4 , s.size()-4) ) );
cout << t;
flag = false;
continue;
}
p = 0;
if( ( p = s.find(s2) ) != string::npos)
{
int n1 = stoi( s.substr(0 , p) );
int n2 = stoi( s.substr(p+1 , s.size() - p -1));
cout << pow(n1 , n2);
flag = false;
continue;
}
for(int i = 0 ; i < 10 ; i++)
{
if( (p = s.find(s3[i])) != string::npos)
{
cout << i;
flag = false;
continue;
}
}
p = 0;
for(int i = 0 ; i < 5 ; i++)
{
if( (p = s.find(work[i])) != string::npos)
{
int n1 = stoi( s.substr(0 , p) );
int n2 = stoi( s.substr(p+1 , s.size() - p -1));
if(s[p] == '+') cout << n1+n2;
if(s[p] == '-') cout << n1-n2;
if(s[p] == '*') cout << n1*n2;
if(s[p] == '/') cout << n1/n2;
if(s[p] == '%') cout << n1%n2;
flag = false;
}
}
if(flag) cout << stoi(s);
}
return 0;
}
----> 1119 胖达与盆盆奶(重点题)
分析:使用数组A记录每个熊猫的体重,L[i]表示第i个数的右边有几个连续下降的数(过程中可以有相等的数字,但是只记录不重复的数字的数量),R[i]则表示第i个数左边有几个连续下降的数(也是可以相等但是不记录)。从左到右遍历每一个i,然后看一下它右边有多少个连续下降的数。从右到左同理,看一下i的左边有多少个连续下降的数。对于每一只熊猫,取L[i]和R[i]中较大的那个数*100+200,就是这只熊猫应该喝的牛奶的毫升数。最后计算他们的总和就可以啦。
#include <bits/stdc++.h>
using namespace std;
int n , ans = 0, A[10005] , L[10005] , R[10005];
int main()
{
cin >> n;
for(int i = 0 ; i < n ; i++) cin >> A[i];
for(int i = 0 ; i < n ; i++)
{
int j = i;
while(j < n-1 && A[j] >= A[j+1])
{
if(A[j] > A[j+1]) L[i]++;
j++;
}
}
for(int i = n-1 ; i >= 0 ; i--)
{
int j = i;
while(j > 0 && A[j] >= A[j-1])
{
if(A[j] > A[j-1]) R[i]++;
j--;
}
}
for(int i = 0 ; i < n ; i++)
{
ans += max(L[i] , R[i]) * 100 + 200;
}
cout << ans;
return 0;
}
1123 舍入
没AC
#include<bits/stdc++.h>
using namespace std;
void add(string & str , int p , int d)
{
string tem;
int temp = 1;
for(int i = p+d ; i >= 0 ; i--)
{
if(str[i] == '.')
{
tem += ".";
continue;
}
temp += (str[i] - '0');
tem += to_string(temp %10);
temp /= 10;
}
if(temp) tem += "1";
reverse(tem.begin() , tem.end());
str = tem;
}
int main()
{
int n , d;
cin >> n >> d;
while(n--)
{
int num;
string str;
cin >> num >> str;
int p = str.find(".");
while(str.size() <= p + d + 1) str += '0';
if(num == 1)
{
if(str[p+d+1] >= '5') add(str , p , d);
cout << str.substr(0 , p+d+1) << endl;
}
else if(num == 2)
{
cout << str.substr(0 , p+d+1) << endl;
}
else if(num == 3)
{
if(str[p+d+1] > '5')
{
add(str , p , d);
cout << str.substr(0 , p+d+1) << endl;
}
else if(str[p+d+1] == '5')
{
bool f = false;
for(int i = p+d+2 ; i < str.size() ; i++)
{
if(str[i] != '0'){
f = true;
break;
}
}
if(f)
{
add(str , p , d);
cout << str.substr(0 , p+d+1) << endl;
}
else
{
if((str[p+d]-'0') % 2 == 1) add(str , p , d);
cout << str.substr(0 , p+d+1) << endl;
}
}
else
{
cout << str.substr(0 , p+d+1) << endl;
}
}
}
return 0;
}