查找
#include<iostream>
using namespace std;
int main() {
int s[100];
int i, n, m,fin;
cin >> n;
for ( i = 0; i < n; i++) {
cin >> s[i];
}
cin >> m;
for (int j = 0; j < m; j++) {
cin >> fin;
for (i = 0; i < n; i++) {
if (fin == s[i]) {
cout << "YES" << endl;
break;
}
}
if(i==n) cout << "NO"<<endl;
}
}
#include<iostream>
#include<string>
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
int main() {
string s,s1, c;
while (cin>>s){
int n, m;
cin >> n;
//cout << s << endl;
for (int i = 0; i < n; i++) {
getchar();
getline(cin, c);
int fi = c[1] - '0';
int le = c[2] - '0';
if (c[0] == '0') {
//翻转
for (int j = fi; j < (fi + le - 1) / 2; j++) {
char tem = s[j];
s[j] = s[fi + le - 1 - j];
s[fi + le - 1 - j] = tem;
}
}
else {
//替换
string sub = c.substr(3, le);
s.replace(fi, le, sub);
}
cout << s << endl;
}
}
}
/*
for(int i=0;i<n;i++){
string op;
cin >> op;
int begin = op[1] - '0', len = op[2] - '0';
int end = begin + len - 1;
if (op[0] == '0') {
for (int i = 0; i < len / 2; i++) {
char tem = s[begin + i];
s[begin + i] = s[end - i];
s[end - i] = tem;
}
}
else {
string tem = op.substr(3, op.size() - 3);
s.replace(begin, len, tem);
}
cout << s << endl;
*/
注意:上楼梯有些是找规律题注意一下
统计平均分
#include<stdio.h>
#include<stdlib.h>
int main(){
int n,f;
int score;
int sum=0,sumn=0,sumg=0;
int cntg=0,cntn=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&f,&score);
if(f==1){
//男
sumn+=score;
cntn++;
}else{
//女
sumg+=score;
cntg++;
}
}
if(cntn!=n||cntg!=n){
printf("%.1f %.1f %.1f",(sumn+sumg)/n,sumn/cntn,sumg/cntg);
}
else if(cntn==5){
printf("%.1f %s %.1f",(sumn+sumg)/n,"X",sumg/cntg);
}
else if(cntg==5)
{
printf("%.1f %.1f %s",(sumn+sumg)/n,sumn/cntn,"X");
}
return 0;
}
矩阵移动
平移偶数列:
需要平移的是第 2、4、6 列。给定 k=2,应该将这三列顺次整体向下平移 1、2、1 位(如果有更多列,就应该按照 1、2、1、2 …… 这个规律顺次向下平移),顶端的空位用 99 来填充。平移后的矩阵变成:
#include<iostream>
using namespace std;
int main() {
int n, k, num;
int nnum;
int s[100][100];
cin >> n >> k >> num;
nnum = num;
//输入矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> s[i][j];
}
}
int f = 1;
int j = -1;
while (j < n) {
j += 2;
num = nnum;
if (f == 1) {
for (int i = 0; i < n; i++) {
//移动一位
int tem = s[i][j];
s[i][j] = num;
num = tem;
}
}
else {
//移动k位
for (int i = n - 1; i >= 0; i--) {
if (i >k-1) {
s[i][j] = s[i - k][j];
}
else s[i][j] = nnum;
}
}
if(f == 1) f = 0;
else f = 1;
}
//打印
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << s[i][j]<<" ";
}
cout << endl;
}
}
沙漏
#include<iostream>
using namespace std;
int main(){
int n=7,i,j,k;
//7-2i
for(i=0;i<=n/2;i++){
for( j=0;j<i;j++){
cout<<" ";
}
for( k=0;k<n-2*i;k++){
cout<<"*";
}
for( j=0;j<i;j++){
cout<<" ";
}
cout<<endl;
}
for( i=n/2-1;i>=0;i--){
for( j=0;j<i;j++){
cout<<" ";
}
for( k=0;k<n-2*i;k++){
cout<<"*";
}
for( j=0;j<i;j++){
cout<<" ";
}
cout<<endl;
}
}
完全数
注意题目格式要求
#include<iostream>
using namespace std;
int main(){
int n;
int yin[5000];
cin>>n;
for(int i=2;i<=n;i++){
int cnt=0;
int sum=0;
for(int j=1;j<=i/2;j++){
if(i%j==0) yin[cnt++]=j;
}
for(int k=0;k<cnt;k++){
sum+=yin[k];
}
if(i==sum){
cout<<i<<" its factors are ";
for(int k=0;k<cnt;k++){
cout<<yin[k]<<" ";
}
cout<<endl;
}
}
}
顺序表
#include<stdio.h>
#include<stdlib.h>
int Maxlen=100;
struct node {
int size;
int max;
int *data;
};
int main(){
int n,i,k;
scanf("%d",&n);
struct node *L=(struct node*)malloc(sizeof(struct node)*Maxlen);
L->data=(int*)malloc(sizeof(int)*Maxlen);
L->size=0;
L->max=Maxlen;
for( i=0;i<n;i++){
scanf("%d",&L->data[i]);
L->size++;
}
int fin;
scanf("%d",&fin);
// 0 1 2 3 4 5
// 1 3 5 7 9
//6,3,5,7,7,9
for( i=0;i<n;i++){
int d=L->data[i];
if(fin<d) {
break;
}
}
//注意k的作用域,注意重复声明
for( k=L->size;k>i;k--){
L->data[k]=L->data[k-1];
//printf("%d",k);
}
//printf("%d",k);
L->data[k]=fin;
L->size++;
for( i=0;i<L->size;i++){
int d=L->data[i];
printf("%d",d);
if(i<L->size-1) printf(",");
}
}
吃桃子
注意寻找规律
#include<iostream>
using namespace std;
int main(){
int t,k,n;
cin>>t;
for(int i=0;i<t;i++){
cin>>n>>k;//第n天剩k个桃子
while(n>1){
k=(k+1)*3;
n--;
}
cout<<k<<endl;
}
}
pta
java的正则表达式??
这个思路太绝了,厉害厉害 judge 的标识
//隐含条件: 左边a数*中间A数=右边a数
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n;
string s;
cin >> n;
while (n--) {
int judge = 0;
int cntl = 0, cntr = 0, cnt = 0;
cin >> s;
bool cho = true;
for (int i = 0; i < s.size(); i++) {
char c = s[i];
if (s[i] == 'P' || s[i] == 'A' || s[i] == 'T') {
if (judge == 0 && c == 'A') cntl++;
else if (judge == 0 && c == 'P') judge = 1;
else if (judge == 1 && c == 'A') cnt++;
else if (judge == 1 && c == 'T') judge = 2;
else if (judge == 2 && c == 'A') cntr++;
else cho = false;
}
else {
cho = false;
break;
}
}
//注意pta三个字母缺一不可,注意judge!=2 是判断是否出现T
if (cnt == 0 || cnt * cntl != cntr || judge!=2) cho = false;
if (cho) cout << "YES"<<endl;
else cout << "NO"<<endl;
}
}
成绩排名,打擂台,存储max,min
//隐含条件: 左边a数*中间A数=右边a数
#include<iostream>
#include<vector>
using namespace std;
//1、对于一个对象 可以采用结构体
//我想到的方法是先用结构体存储每一个学生的特征,然后进行遍历结构体数组,打擂台,找到max的位置和min的位置,在遍历以便输出,显然我的这种思路没有下面的这种简洁。
struct stu {
char* name;
char* id;
int score;
};
int main() {
int n;
cin >> n;
string name_good, code_good, name_bad, code_bad;
int good_score = -1, bad_score = 101;
for (int i = 0; i < n; i++) {
string name, code;
int score;
cin >> name >> code >> score;
//这个里面的赋值转换很重要,打擂台登记
if (score > good_score) {
good_score = score;
code_good = code;
name_good = name;
}
if (score <bad_score) {
bad_score = score;
code_bad = code;
name_bad = name;
}
}
cout << name_good << code_good << good_score << endl;
cout << name_bad << code_bad << bad_score << endl;
return 0;
}
3n+1 猜想 避免重复计算
//注意思想: 利用对应下标存储数据
//隐含条件: 左边a数*中间A数=右边a数
#include<iostream>
#include<vector>
using namespace std;
//卡拉兹验证猜想:
//偶数就折半,奇数就3*n+1
int main() {
int n;
cin >> n;
int num[101] = { 0 };
//将输入的数存储崽对应的数组下,
for (int i = 0; i < n; i++) {
int tem;
cin >> tem;
num[tem] = 1;
}
for (int i = 0; i < 101; i++) {
//中途标记好验证中出现的卡拉兹数
if (num[i] == 1) {
int tem = i;
while (tem > 1) {
if (tem % 2 == 0) tem /= 2;
else tem = (3 * tem + 1) / 2;
if (tem != 1 && tem < 101)num[tem] == 0;
}
}
}
int cnt = 0; for (int i = 100; i >= 0; i--) {
if (num[i] == 1) {
if (cnt != 0) cout << " ";
cout << i;
cnt++;
}
}
return 0;
}
234—BBSSS1234
我的思路是以字符串读入,那么我的前提就是可能不知道输入的 有几位数,导致操作复杂化
而大神则直接以整数读取,直接模除得到数字后直接输出
一般处理大数的时候才以字符串读取
#include<iostream>
#include<string>
using namespace std;
int main() {
string s;
cin >> s;
int cnt = 1;
char ss[100];
int k = 0;
int cc = 0;
for (int i = s.size()-1; i >= 0;i--) {
int c = s[i] - '0';
cc = c;
if (cnt == 1) {
for (int j = 0; j <c; j++) {
ss[k++] = cc+'0';
cc--;
}
}
if (cnt == 2) {
for (int j = 0; j < c; j++) {
ss[k++] = 'S';
}
}
if (cnt == 3) {
for (int j = 0; j < c; j++) {
ss[k++] = 'B';
}
}
cnt++;
}
for (int j = k-1; j >=0; j--) {
cout << ss[j];
}
}
素数对
素数中只有2是偶数,1不是素数哦
利用数组下标对应存储相应的数据!!善于使用falg
#include<iostream>
#include<string>
using namespace std;
int susu(int n) {
for (int i = 2; i < n / 2; i++) {
if (n % i == 0) return 0;
}
return 1;
}
int main() {
int n;
int su[100] = { 0 };
cin >> n;
int cnt = 0;
for(int i=2;i<=n;i++){
if (susu(i) == 1) su[i] = 1;
}
for (int i = 3; i <= n; i+=2) {
if (su[i] == 1 && su[i + 2] == 1) cnt++;
}
cout << cnt;
}
利用vector存储数组,节省空间
数组循环右移
我这个方法有限制,移动的位数小于原有数组我长度
#include<iostream>
#include<string>
using namespace std;
int main() {
int n,t,i;
cin >> n >> t;
int num[200];
for ( i = 0; i < n; i++){
cin>>num[i];
}
for (int j = 0; j < n; j++) {
num[i++] = num[j];
}
for (int j = 6-t; j < n+6-t; j++)
{
cout << num[j];
}
}
利用循环队列 牛
说反话
c++string数组中每一个元素,可以是一个字符串
我最开始的想法是利用分割split 然后存到数组,遍历
一元函数求导
2的31次方-1最大值
32位机子的最大值是2的31次方-1;根据题目的数据范围需要使用long long类型读取数据
数字分类
#include
c++ 中要输指定格式的数据,需要引入此头文件,就可以使用printf了
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main() {
int n;
cin >> n;
int num;
int sum1 = 0;
int sum2 = 0;
int cnt = 0;
double sum4 = 0; //注意如果最后整除求平均值,则这里类型必须是double 如果是int,后面还是得不到小数部分的实际值
int max = -1;
int k = 0;
int f = 1;
for (int i = 0; i < n; i++) {
cin >> num;
if (num % 5 == 0 && num % 2 == 0) sum1 += num;
if (num % 5 == 1) {
if (f == 1) {
sum2 += num;
}
else sum2 -= num;
if (f == 1)f = 0;
else f = 1;
}
if (num % 5 == 2) cnt++;
if (num % 5 == 3) {
sum4 += num; k++;
}
if (num % 5 == 4)
{
if (num > max) max = num;
}
}
cout << sum1 << ' ' << sum2 << ' ' << cnt << ' ' << max<<endl;
printf("%.1lf", sum4/k);
return 0;
}
#include
使用c数学库
素数
划拳
团体赛
注意c是可以以某种格式读入的,如果输入都是特定格式,就可以使用scanf读入,
我一开始想着以字符串读入,给自己后期添加了麻烦(要从字符串中分解除队伍,队员,分数),麻烦化了哦。
一开始读入就可以很好的解决啊!!!!
大神的思路就是6666 铭记铭记