PAT乙级(考研上机复习 重点题&易错题)

文章目录

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 福尔摩斯的约会

严格判断每种限制

  1. 星期的字符限制在 A~G
  2. 分钟的限制在 0~9 A~N
  3. 秒钟的限制是 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 有理数四则运算(重点题)

思路很重要!

  1. 判断分子/分母 Inf ,0 的情况
  2. flag = 1 表示为负数,那么需要考虑括号
  3. 如果为负数,加上 (-
  4. m , n 取绝对值, x = m/n 整数部分,如果不为0,就添加
  5. 如果 m整除n,那么就没有分数部分 直接判断flag,是否添加 ),并退出
  6. 还没退出,说明有分数部分,并且如果有整除部分,得加一个空格
  7. 分子减去整数部分的值
  8. __gcd分母的最大公倍数, 分子分母分别除以最大公倍数就是最简式
  9. 最后判断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 火星数字(重点题)

复杂 模拟题

  1. getchar() 吸掉换行 + getline(cin, t) 获取每一行的数据
  2. 通过t[0]判断是否是地球文(数字)
  3. stoi(t):字符串转化成int数值
  4. 关键在于:个位数如果是0,不会打印出来。因为十位是不同的标记,不需要个位的0
  5. 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 螺旋矩阵(重点题)

aHR0cHM6Ly93d3cubGl1Y2h1by5uZXQvd3AtY29udGVudC91cGxvYWRzLzIwMTYvMDgvUVEyMDE5MDEwNy0xNjQxNDBAMngucG5n.png

#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;
}
  • 33
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值