训练营

随机序列 问题:

alt

随机序列代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+5;
 
int n, a[N];
 
int main()
{
    int T;
    cin >> T;//输入一个数
    while (T--)//循环
    {
        cin >> n;
        for (int i = 1; i <= n; i ++ ) cin >> a[i];
         
        int maxn = 0, minn = 2e9;
        double ave = 0, ans = 0;
        for (int i = 1; i <= n; i ++ )
        {
            maxn = max(maxn, a[i]);
            minn = min(minn, a[i]);
            ave += a[i];
        }
        ave /= n;
         
        for (int i = 1; i <= n; i ++ )
            ans += (a[i] - ave) * (a[i] - ave);
         
        cout << maxn - minn << " ";
        printf("%.3f\n", ans/n);
    }
    return 0;
}

计数问题

alt 我的代码:我的问题: 代码太繁琐了,

#include<iostream>
using namespace std;
int crr(int n,int x)
{   int cans=0;
	for(int i=1;i<=n;i++)
	{  int b=i;
	    while(b>0)
	    {  int m=b%10;
	        if(m==x){
			cans++;
	    	}
	    	b/=10;
		}
	    
		
	}
	return cans;
 } 
int main()
{   int n,x;
    cin>>n>>x;
    cout<<crr(n,x)<<endl;
	
	
	return 0;
}

老师的代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+5;

int n, x, ans = 0;

int main()
{
	cin >> n >> x;
    for (int i = 1; i <= n; i ++ )
    {
        int nn = i;
        while (nn)
        {
            if (nn % 10 == x) ans ++ ;
            nn /= 10;
        }
    }
	
	cout << ans << endl;
	return 0;
}

#1003约瑟夫环 alt **我的问题:**没有写出来看不懂题目,不会环状怎么维护

老师的代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e2+5;

int n, k, m;
bool st[N];
int cnt = 0, num = 0;

int main()
{
	cin >> n >> k >> m;
	for (int i = k; ; i ++ )
	{
		i %= n;
		
		if (cnt == n-1) break;
		
		if (st[i] == 0) num ++ ;
		if (num == m) st[i] = 1, num = 0, cnt ++ ;
	}
	int ans = -1;
	for (int i = 0; i < n; i ++ )
		if (st[i] == 0) ans = i;
	cout << ans << endl;
	return 0;
}

校门外的树

思路; 1.用一个数组,把0到L的全部地方遍历成0, 2.用一个for循环遍历0到M遍,输入h,M,把h到M之间的都遍历成1, 3.计算arr[]==0有多少。 alt 代码;

#include<iostream>
using namespace std;
const int N=1e4+10;
int L,M;
int arr[N];
int main(){
	int ans=0;
	cin>>L>>M;
	for(int i=0;i<=L;i++)
	{
		arr[i]=0; 
	}
	for(int j=0;j<M;j++)
	{   int h,t;
	     cin>>h>>t;
		for(int k=h;k<=t;k++)
		{
			arr[k]=1;
		}
	}
	for(int i=0;i<=L;i++)
	{  
		if(arr[i]==0)ans++;
	}
	cout<<ans<<endl;
	return 0;
}

求月亮大小

思路: 坑点:其实循环循序0150 用一个数组存入点点观测的那段时间 2.用if判断判断最后那个数是什么如果是15,就输出dowm,如果是0 就输出up;如果最后那个大于前一个就up,如果后一个小于就dowm;如果输入的数只有一个就无法判断就输出-1; alt 老师的代码;

#include <bits/stdc++.h>
using namespace std;
const int N = 1e2+5;

int n;
int a[N];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ ) cin >> a[i];
	
	if (a[n] == 15) puts("DOWN");	//!!!
	else if (a[n] == 0) puts("UP");	//!!!
	else if (n == 1) puts("-1");
	else if (a[n-1] < a[n]) puts("UP");
	else puts("DOWN");
	
	return 0;
}

求距离

思路: 1.循环输入n个数,用p1,p2来存放1~n之间最大和最小的数的地址 2.把最小的或者最大的数放在两边就有可能让两个数的距离最大 3.看两边的距离离最大或最小的那个距离到最大或者最小的数看哪个最大就可以换,一共四种情况 alt

代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e2+5;

int n;
int a;
int p1, p2;

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ )
	{
		cin >> a;
		if (a == n) p1 = i;
		if (a == 1) p2 = i;
	}
	int ans = max(abs(p1-1), abs(n-p1));
	ans = max(ans, max(abs(p2-1), abs(n-p2)));
	
	cout << ans << endl; 
	
	return 0;
}

数列下标

思路:边判断边输出 2.在当前的位置的下一个开始比较如果下面的有比当前 的数大就输出那个大的数的下标 alt

代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+5;

int n, a[N];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ ) cin >> a[i];
	
	for (int i = 1; i <= n; i ++ )
	{
		int res = 0;
		for (int j = i + 1; j <= n; j ++ )
			if (a[j] > a[i])
			{
				res = j;
				break;
			}
		cout << res << " ";
	}
	
	return 0;
}

F课程满意程度计算

思路:1. alt

代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+5;

int n, m;
int cnt[N];

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i ++ )
	{
		int a, x;
		cin >> a;
		while (a--)cin >> x, cnt[x] ++ ;
	}
	int ans = 0;
	for (int i = 1; i <= m; i ++ )
		if (cnt[i] == n) ans ++ ;//计算如果哪门等于人数就加一
	cout << ans << endl;
	return 0;
}

二进制十进制

alt

代码
#include<iostream>
using namespace std;
double er(int x)//用double创建一个er的函数
{   int a1,ans=0;
   double i=1.0,j=0.0;
    while(x!=0){
    	a1=x%2;//每次得到的余数
    	x=x/2;
    	j=j+i*a1;
    	i=i*10;//i从每1每次乘10倍,因为后得到的数要从左往右输出
	}
   	return j;
}
int main(){
	int A,B;
	cin>>A>>B;
	printf("%.lf",er(A)+er(B));
	
	return 0;
}

老师的代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+5;

int a, b;
vector<int> g;

int main()
{
	cin >> a >> b;
	while (a || b)
	{
		g.push_back(a%2 + b%2);
		a/=2, b/=2;
	}
	for (int i = g.size()-1; i >= 0; i -- )
		cout << g[i];
	return 0;
}

序列中整数去重

alt

代码;
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3+5;

int n;
bool st[N];

int main()
{
	cin >> n;//要输入几个数
	int x;
	for (int i = 1; i <= n; i ++ )
	{
		cin >> x;
		if (st[x] == 0) st[x] = 1, cout << x << " ";//先输入的记号为1,输出x。边辩证边输出
	}
	return 0;
}

有序序列插入一个整数

alt

代码;
#include<iostream>
#include<algorithm>
using namespace std;
const int N=55;
int main()
{int n,b,arr[N];
cin>>n;
    for(int i=0;i<n;i++)
    {
    	cin>>arr[i];//先输入一组数
	}
	cin>>arr[n];//在最后输入一个数
	
	sort(arr,arr+n+1);//把数组从小到大排序一下
	for(int i=0;i<=n;i++)
	{
		cout<<arr[i]<<' ';//按顺序输出数组
		
	}
	cout<<endl;
     
	
}

老师的代码;

#include <bits/stdc++.h>
using namespace std;
const int N = 55;

int n;
int a[N];
int x;

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++ ) cin >> a[i];//输入一个数组
	cin >> x;//插入的数
	
	bool flag = 1;//标记
	for (int i = 1; i <= n; i++ )
	{
		if (flag && a[i] > x) cout << x << " ", flag = 0;//如果a【i】大于x就输出x
		cout << a[i] << " ";//如果x大于a【i】就输出a【i】;
	}
	if (flag) cout << x << " ";//如果数组的数全都小于x最后输入x
	
	return 0;
}

打印质数表

alt

代码
#include <bits/stdc++.h>
using namespace std;
const int N = 55;

int n;

bool is(int x)//判断质数的函数方法
{
    if (x <= 1) return 0;
	for (int i = 2; i <= x/i; i ++ )
	{
		if (x % i == 0) return 0;
	}
	return 1;
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ )
		if (is(i)) cout << i << " ";
	
	return 0;
}

质数分布

alt

代码
#include <bits/stdc++.h>
using namespace std;
const int N = 55;

int n;

bool is(int x)//判断质数的函数方法
{
    if (x <= 1) return 0;
	for (int i = 2; i <= x/i; i ++ )
	{
		if (x % i == 0) return 0;
	}
	return 1;
}

int main()
{
	int T;//数组组数
	cin >> T;
	while (T--)
	{
		cin >> n;//数组的个数

		int ans = 0;//计数初始化,每一次循环都初始化一次
		for (int i = 1; i <= n; i ++ )
			if (is(i)) ans ++ ;//如果合适就加一
		
		cout << ans << endl;//输出结果
	}

	return 0;
}

有序序列合并

alt

我的代码

段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int main()
{  
   int n,m,arr[N],brr[N];
   cin>>n>>m;
   for(int i=0;i<n;i++)
   { 
     cin>>arr[i];
   }
   for(int j=n;j<n+m;j++)
   {
   	cin>>arr[j];
   	
   }
   sort(arr,arr+n+m);
   for(int i=0;i<n+m;i++)
   {
   	cout<<arr[i]<<' ';
   }
   cout<<endl;
	return 0;
}
老师的代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3+5;

int n, m;
int a[N], b[N];
int c[N], idx=0;

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i ++ ) cin >> a[i];//输入第一个数组
	for (int i = 1; i <= m; i ++ ) cin >> b[i];//输入第二个数组
	
**	int ai = 1, bi = 1;
	while(ai <= n && bi <= m)
	{
		if (a[ai] <= b[bi]) c[++idx] = a[ai], ai ++ ;//把两个数组的数从第一个数开始对比,把比较大的数存进新建立的空数组c[]。看哪个大了就把把哪组的下标向下移。++idx从1开始
		else c[++idx] = b[bi], bi ++ ;
	}
	
	while (ai <= n) c[++idx] = a[ai], ai ++ ;
	while (bi <= m) c[++idx] = b[bi], bi ++ ;**
	
	for (int i = 1; i <= idx; i ++ )
		cout << c[i] << " ";

	return 0;
}

杨辉三角

alt

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 40;

int n;
LL c[N][N];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ )
	{
		for (int j = 1; j <= i; j ++ )
		{//找到规律
			if (j == 1 || j == i) c[i][j] = 1;//如果在位置1或者i(最后)就输出1
			else c[i][j] = c[i-1][j] + c[i-1][j-1];//其他的位置为上一个数和上一个数的左边
			cout << c[i][j] << " ";//边得到数边输出得数
		}
		cout << endl;
	}
		
	
	return 0;
}

矩形元素定位

alt

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 10;

int n, m;
int a[N][N];

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i ++ )//输入一个n行m列的矩阵
		for (int j = 1; j <= m; j ++ )
			cin >> a[i][j];
			
	int x, y;
	cin >> x >> y;
	cout << a[x][y] << endl;//输出x行y列的那个数
	
	return 0;
}

上三角矩阵判断

alt

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 15;

int n;
int a[N][N];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++ )//输入一个矩阵
		for (int j = 1; j <= n; j ++ )
			cin >> a[i][j];
			
	bool flag = 1;//设计一个标记,但是这个标记不可以全局设计
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= i-1; j ++ )
			if (a[i][j] != 0)
			{
				flag = 0;
				break;
			}
	
	if (flag) puts("YES");
	else puts("NO");
	return 0;
}

扫雷

alt

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e3+5;

int n, m;
char str[N][N];

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i ++ ) cin >> str[i]+1;//重1号下标开始输入一个矩阵
	
	for (int i = 1; i <= n; i ++ )
	{
		for (int j = 1; j <= m; j ++ )
		{
			if (str[i][j] == '*') cout << '*';//如果相同就输出*,
			else 
			{
				int cnt = 0;
				for (int k = i-1; k <= i+1; k ++ )//从i行的前一行到i的后一行
					for (int l = j-1; l <= j+1; l ++ )
						if (str[k][l] == '*') cnt ++ ;
				cout << cnt ;
			}
		}
		cout << endl;
	}
		
	
	return 0;
}

矩阵转置

alt

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 15;

int n, m;
int a[N][N];

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= m; j ++ )
		 	cin >> a[i][j];
	
	for (int i = 1; i <= m; i ++ )
	{
		for (int j = 1; j <= n; j ++ )
			cout << a[j][i] << " ";
		cout << endl;
	}
		
	
	return 0;
}

我的代码

#include<iostream>
using namespace std;
int main()
{
 int arr[10][10],brr[10][10];
int n,m;cin>>n>>m;
    for(int i=0;i<n;i++)
 	{
 		for(int j=0;j<m;j++)
 		{
 		  cin>>arr[i][j];
		   	brr[j][i]=arr[i][j];//重复多余
		}
	}

	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			cout<<brr[i][j]<<' ';	
		}
		cout<<endl;
	}
	return 0;
}

wyh的矩阵

alt alt

代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e4+5;

LL n;
int a[N][N];

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		cin >> n;
		LL m = (n-1)/2;
		LL ans = (1 + m) * m / 2 * 4 + 1;
		cout << ans*ans << endl;
	}
	
//	for (int n = 3; n <= 15; n += 2 )
//	{
//		int idx = 0;
//		for (int i = 1; i <= n; i ++ )
//			for (int j = 1; j <= n; j ++ )
//				a[i][j] = ++idx;
//		
//		LL ans = 0;
//		int m = (n+1)/2;
//		for (int i = 1; i <= m; i ++ )//(i-1)
//			for (int j = m-(i-1); j <= m+(i-1); j ++ )
//				ans += a[i][j];
//			
//		for (int i = m+1, k = m-2; i <= n; i ++ , k -- )
//			for (int j = m-k; j <= m+k; j ++ )
//				ans += a[i][j];
//		
//		cout << n << " " << sqrt(ans) << " ";
//		cout << ans << endl;	
//	}
	
	return 0;
}

BFS

alt

输入

Bobob

输出

0

网上的代码
#include <iostream>
using namespace std;
int main()
{
    int i, len;
    string str;
    while (cin >> str)//不知道要传入多少的字符就可以写成while(cin>>str)就会输完要输入的
    {
        len = str.length() - 2;
        for (i = 0; i < len; i++)
            if ((str[i] == 'b' || str[i] == 'B') && (str[i + 1] == 'o' || str[i + 1] == 'O') && (str[i + 2] == 'b' || str[i + 2] == 'B'))
                break;
        if (i >= len)
            puts("-1");
        else cout << i << endl;
    }
    return 0;
}
老师的代码
#include<iostream>
#include<cstring>
using namespace std;
string s;
int main(){
    cin>>s;
    for(int i=0;s[i];i++)//如果不知道输入多少for中的条件可以写成s[i];
        if(s[i]>='A'&&s[i]<='Z')//把输入的字符串大写的都变成小写的;
            s[i]+=32;//因为大写与小写之间相差32;
    int n = s.size();
    for(int i=0;i<n-2;i++){
        if(s.substr(i,3)=="bob"){
            cout<<i<<endl;
            return 0;
        }//substr函数s.substr(i,len)从字符串s中的索引i开始打印长度为len的子字符串;
    }
    cout<<-1<<endl;
    return 0;
}
说明:substr函数的用法(俗称字符截取函数)格式1:substr(string string,int a,int b)1.string 需要截取的字符串

2.a 截取字符串的开始位置(注:当a是0或者1是都是从第一位开始截取.如果字符串中有空格也算一个字符)3. b是要截取的字符串的长度; 事例: 注释:当a是1/0时都是从第一个开始截取 substr('helloworld',1,3)返回结果是hel截取从h开始的3个字符。 substr('helloworld',0,3)返回结果是hel截取从h开始的3个字符。 注释:当|a|<b截取的是a的个数,当|a|>=b截取的是b的个数; substr('helloworld',—1,3)返回结果是d(从后面倒数第一位开始往后取1位字符) substr('helloworld',—4,3)返回结果是orl(从后面倒数第四位开始往后取3位字符)

格式2:substr(string string ,int a)1.string 需要截取的字符串;2.a可以理解成为从a个字符开始截取后面所有的字符串 substr('helloworld',2)返回结果是elloworld(从e开始截取之后的所有字符) substr('helloworld',-3)返回结果是rld(从最后一个往回截取3个字符)

格式三:使用substr()函数:s.substr(i,len)从字符串s中的索引i开始打印长度为len的子字符串;

李在赣神魔

alt

## 输入:
3
aaa
bbb
ccc
## 输出:
cba
cba
cba
代码
#include <bits/stdc++.h>
using namespace std;

int main(){
    string st[1010];
    int n;
    cin >> n;
    for (int i = 0; i < n; i ++)cin >> st[i];
    for (int i = 0; i < n; i ++)    // 列
    {
        for (int j = n - 1; j >= 0; j --) // 行
            cout << st[j][i];
        cout << endl;
    }
    return 0;
}

数独合理吗?

alt

memset的头文件为#includ<string.h>//c语言#include//c++ 函数原型:voidmemset(voids,int c,size_t n);s是指针,指向需要修改的对象,例如某个数的首地址

size_t是unsigned int类型,即是无符号整型; n是指需要修改的字节数量,即又n个字节需要被修改 c是指需要更改为什么内容 eg. char a[]="abcdefgh"; memset(a,'0',5;输出结果为00000fgh;意思就是将数组a的前5个数替换成0;其中数组传递的指针,所以该操作会直接修改数组。 应用:可以用该数组来清空数组,做初始化工作等 memset(a,'\0'sizeof(a))该操作会使得a被清空; memset(a,0,sizeof(a))该操作会使得啊数组的每一个元素都为0;

#include <bits/stdc++.h>
using namespace std;
int a[10][10];
int b[10];
int main(){
    for (int i = 1; i <= 9; i ++)//输入数独
        for (int j = 1;j <= 9; j ++)
            cin >> a[i][j];
    bool flg = true;//插一个为真的旗帜标记一下
    for (int i = 1; i <= 9; i ++)
    {
        for (int j = 1; j <= 9; j ++){
            
            for (int k = 1; k <= 9; k ++){//判断打横过的数有没有重复的,有重复就flg=false,跳出循环break;
                if (b[a[i][k]] == 0)b[a[i][k]] = 1;
                else {
                    flg = false;
                    break;
                }
            }
            memset(b,0,sizeof(b));//重置一下数组都变0;
            for (int k = 1; k <= 9; k ++){//判断打竖过的数有没有重复的,有重复就flg=false,跳出循环break;
                if (b[a[k][j]] == 0)b[a[k][j]] = 1;
                else {
                    flg = false;
                    break;
                }
            }
            // i,j
            if (i % 3 == 0 && j % 3 == 0)
            {
                memset(b,0,sizeof(b));//为什么不放if前面,因为它跳到3*3的位置都要比较一下
                for (int k = i - 2; k <= i; k ++)    //
                    for (int l = j - 2;l <= j; l ++)//判断一下3*3里面的数有没有重复的
                        if (b[a[k][l]] == 0)b[a[k][l]] = 1;
                        else {
                            flg = false;
                            break;
                        }
            }
            memset(b,0,sizeof(b));
            if (!flg)break;
        }
        if (!flg)break;
    }
    if (flg)cout << "YES";
    else cout << "NO";
    return 0;
}

蛇形矩阵

alt

事例

输入:4

输出:

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
代码
  #include<bits/stdc++.h>
using namespace std;
int a[1010][1010];
int main()
{
	int n;
	cin >> n;
    a[1][1] = 1;    //第一个数为一;
    int idx = 2;    // 将要填入的数据
    // 上半部分
	for (int i = 2; i <= n; i ++)// 枚举个数
    {
        if (i % 2)//奇数
        {
            for (int x = i,y = 1;  x >= 1; x --, y ++)    
            {
                a[x][y] = idx ++;
            }
        }
        else    // 偶数
        {
            for (int x = 1,y = i; x <= i; x ++, y --)    // x是行,y列
            {
                a[x][y] = idx ++;
            }
        }
    }
    // 下半部分
    for (int i = n - 1, j = 2; i >= 1; i --,j ++)    // j是行截止的地点,也是列开始的地点
    {
        if (i % 2)
        {
            for (int x = n, y = j; x >= j; x --, y ++)    // x是行y是列
            {
                a[x][y] = idx ++;
            }
        }
        else
        {
            for (int x = j, y = n;  x <= n; x ++, y --)
            {
                a[x][y] = idx ++;
            }
        }
    }
    for (int i = 1; i <= n; i ++)
    {
        for (int j = 1; j <= n; j ++)
        {
            cout << a[i][j] << ' ';
        }
        cout << endl;
    }
	return 0;
}

竞赛技巧

alt

样例输入

11 20 20
11 15 12
14 20 14

样例输出

11 15 12 
11 20 20 
14 20 14

说明 :所以在保证能做对的情况下,我们应当尽量减少罚时

代码
                    #include <bits/stdc++.h>

using namespace std;

struct node {//结构体
    int s,f,m;
};
node s[5050];//数组太大放main外
bool cmp(node a,node b){//定义新的排顺序规则在sort里面可以用
    if (a.s != b.s) return a.s < b.s;//返回小的3值
    if (a.f != b.f) return a.f < b.f;
    if (a.m != b.m) return a.m < b.m;
    return a.m < b.m;
}
int main(){
    int n;cin >> n;
    for (int i = 0; i < n; i ++)
    {
        int a,b,c;
        cin >> a >> b >> c;
        s[i].s = a, s[i].f = b,s[i].m = c;
    }
    sort(s,s + n,cmp);
    for (int i = 0; i < n; i ++)
    {
        cout << s[i].s << ' ' << s[i].f << ' ' << s[i].m << endl;
    }
    return 0;
}

明明的随机数

alt

输入

10
20 40 32 67 40 20 89 300 400 15

输出

                                                                8
15 20 32 40 67 89 300 400
代码
我的代码
#include<bits/stdc++.h>
using namespace std;
int a[1010];
int b[1010],ans=0;//开俩数组a数组是输入原来的数据。b数组存放没有重复的数组
int main()
{  int n;
    int x;
    cin>>n;
    for(int i=0;i<n;i++)
    {
    	cin>>x;
    	if(a[x]==0)b[ans]=x,a[x]=1,ans++;//判断输入的数有没有出现过如果没有就标记成1,然后存到吧数组
	}
	sort(b,b+ans);//从小到大排序
	cout<<ans<<endl;
	for(int i=0;i<ans;i++)
	{
		cout<<b[i]<<' ';
	}
	cout<<endl;
	
	return 0;
}                                                          
老师的代码
#include <bits/stdc++.h>
using namespace std;
int a[110],b[110],idx = 0;
int main(){
    int n; cin >> n;
    for (int i = 0; i < n; i ++) cin >> a[i];
    sort(a,a + n);    // N*lg(N)//先排序
    int t = a[0];//让t等于最小的那个数
    b[idx ++] = t;//让吧数组从0开始存入数
    for (int i = 1; i < n; i ++){
        if (a[i] != t){//如果出现的数和已经出现的数不相等就存到b数组,idx++,t就更新
            b[idx ++] = a[i];
            t = a[i];
        }
    }
    cout << idx << endl;
    for (int i = 0; i < idx; i ++)cout << b[i] << ' ';
    return 0;
}

lcryin的排序题

alt

输入

  5
1 2
2 3
3 4
4 5
5 6
  

输出

 1 2 5
2 3 13
3 4 25
4 5 41
5 6 61 
代码
  #include <bits/stdc++.h>//algorithm是sort的头文件
using namespace std;
struct node {//结构体
    long long x,y,p;
};
node a[14];
bool cmp(node a, node b){
    return a.p < b.p;
}
int main(){
    int n; cin >> n;
    for (int i = 0; i < n; i ++){
        cin >> a[i].x >> a[i].y;
        a[i].p = a[i].x * a[i].x + a[i].y * a[i].y;
    }
    sort(a,a + n, cmp);
    for (int i = 0; i < n; i ++){
        cout << a[i].x << ' ' << a[i].y << ' ' << a[i].p << endl;
    }
    return 0;
}

[NOIP2009]分数线划定

alt

输入:

 6 3
9848 90
6731 88
1422 95
7483 84
8805 95
4162 88                                                          

输出:

88 5
1422 95
8805 95
9848 90
4162 88
6731 88                                                          
我错误的代码:没有考虑到重复的问题,分数线,录取人数的问题
 #include<iostream>
#include<algorithm>
struct node{
	int x,y;
};
node a[5010];
bool cmp(node a,node b){
	if(a.y!=b.y)return a.y>b.y;
	 return a.x<b.x;
	
}
using namespace std;
int main()
{    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
    	cin>>a[i].x>>a[i].y;
	}
	sort(a,a+n,cmp);
	m=m*1.5;
	 for(int i=0;i<n;i++)
    {
    	cout<<a[i].x<<' '<<a[i].y<<endl;
	}
	return 0;
}                                                              
老师正确的代码
#include <bits/stdc++.h>
using namespace std;
struct node {
    int b,f;
};
node a[5050];
bool cmp(node a, node b){
    if (a.f != b.f) return a.f > b.f;
    return a.b < b.b;
}
int main(){
    int n,m; cin >> n >> m;
    for (int i = 0; i < n; i ++){
        cin >> a[i].b >> a[i].f;
    }
    sort(a,a + n, cmp);
    m = m * 1.5;
    int t = a[m - 1].f;    // 最后一名的分数
    for (int i = m; i < n; i ++)
    {
        if (a[i].f == t){//本来是m个的如果有和最后一个相等的又要加一个
            m ++;
        }else break;
    }
    cout << t << ' ' << m << endl;//t是分数线
    for (int i = 0; i < m; i ++){
        cout << a[i].b << ' ' << a[i].f << endl;
    }
    
    
    return 0;
}
          
  

[NOIP2007]奖学金

alt

输入:

6 
90 67 80 
87 66 91 
78 89 91 
88 99 77 
67 89 64 
78 89 98

输出:

6 265
4 264
3 258
2 244
1 237

[NOIP2007]奖学金

  ![alt](https://uploadfiles.nowcoder.com/images/20240513/486182541_1715604348834/D2B5CA33BD970F64A6301FA75AE2EB22)

输入:

6 
90 67 80 
87 66 91 
78 89 91 
88 99 77 
67 89 64 
78 89 98

输出:

6 265
4 264
3 258
2 244
1 237
我的只过90%样例的代码:少了判断学号大小的cmp了
  #include<iostream>
#include<algorithm>
using namespace std;
struct node{
	int x,y,s,y1,z;//学号,语文,数学,英语,总分;
};
node a[350];
bool cmp(node a,node b)
{
	if(a.z!=b.z)return a.z>b.z;
	else return a.y>b.y; 
}
int main()
{    int n;
cin>>n;
    for(int i=0;i<n;i++)
    {
    	cin>>a[i].y>>a[i].s>>a[i].y1;
    	a[i].x=i+1;
    	a[i].z=a[i].y+a[i].s+a[i].y1; 
	}
	sort(a,a+n,cmp);
	for(int i=0;i<5;i++)
	{
		cout<<a[i].x<<' '<<a[i].z<<endl;
	}
	return 0;
}

######老师的代码

#include <bits/stdc++.h>
using namespace std;
struct node {
    int z,y,x;//z总分,y语文,x学号
};
node a[310];
bool cmp(node a, node b){
    if (a.z != b.z)return a.z > b.z;
    if (a.y != b.y)return a.y > b.y;
    return a.x < b.x;
}
int main(){
    int n; cin >> n;
    for (int i = 0; i < n; i ++){
        int x,y,z;cin >> x >> y >> z;
        a[i].z = x + y + z;
        a[i].y = x;
        a[i].x = i + 1; 
    }
    sort(a,a + n, cmp);
    for (int i = 0; i < 5; i ++){
        cout << a[i].x << ' ' << a[i].z << endl;
    }
    
    
    return 0;
}

乒乓球

![alt](https://uploadfiles.nowcoder.com/images/20240513/486182541_1715611753215/D2B5CA33BD970F64A6301FA75AE2EB22)

输入:

   WWWWWWWWWWWWWWWWWWWW
WWLWE

输出:


11:0
11:0
1:1

21:0
2:1
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string st,t;
    while (cin >> t) st += t;
    // 11 分制
    int w = 0,l = 0;
    for (int i = 0; i < st.size(); i ++)
    {
        if (st[i] == 'W')w ++;
        if (st[i] == 'L')l ++;
        if (st[i] == 'E')
        {
            cout << w << ':' << l << endl;
            break;
        }
        if (max(w,l) >= 11 && abs(w-l) >= 2){//要超过11或者等于,两人最小要相差2分
            cout << w << ':' << l << endl;
            w = 0,l = 0;
        }
    }
    // 21分制
    w = 0,l = 0;
    cout << endl;
    for (int i = 0; i < st.size(); i ++)
    {
        if (st[i] == 'W')w ++;
        if (st[i] == 'L')l ++;
        if (st[i] == 'E'){
            cout << w << ':' << l << endl;
            break;
        }
        if (max(w,l) >= 21 && abs(w-l) >= 2){//要超过21或者等于,两人最小要相差2分
            cout << w << ':' << l << endl;
            w = 0,l = 0;
        }
    }
    return 0;
}
                                               

斗兽棋

alt

输入:

  tiger elephant

输出:

  tiangou txdy
  备注:
如果牛牛出大象,牛妹出猫,那么我们认为这一局是平局,其他同理
代码
 #include <iostream>
#include <string>
using namespace std;

int main(){
    string s1,s2;
    cin >> s1 >> s2;
    bool flg = false;//标记
    if (s1 == "elephant" && s2 != "mouse")flg = true;//只要牛牛不吃掉牛妹都是输或者平局
    if (s1 == "tiger" && s2 != "elephant")flg = true;
    if (s1 == "cat" && s2 != "tiger")flg = true;
    if (s1 == "mouse" && s2 != "cat")flg = true;
    
    if (flg) cout << "tiangou yiwusuoyou" << endl;
    else cout << "tiangou txdy" << endl;
    return 0;
} 
  

珂朵莉的假toptree

alt alt

代码
#include <string>

using namespace std;

int main(){
    string st="";    //空的字符串
    
    // to_string(数字), 作用:将数字转成字符串
    for (int i = 1; i <= 1001; i ++)
    {
        st += to_string(i);
    }
    int n;
    cin >> n;
    cout << st[n - 1] << endl;
    return 0;
}

to_string函数:可以将数字常量转化为字符常量头文件#include或者#include<string.h>参数类型可以是int,long,double,long long
  #include<iostream>
  #incldue<cstring>
  using namespace std;
  int main(){
     int x=556;
     string str=to_string(x);
     cout<<str<<endl;
     cout<<str[0]<<endl;
     return 0;
  }
  结果是
  556
  5

简写单词

alt

用getline(cin,s)读入一整行,除了第一个单词,其余后面的单词的前面都会有一个空格, 那么只需将第一个单词的首字母变成大写后输出,后面判断时,只要前一个位置是空格,那么这个位置就是单词的首字母

输入:

  College English Test
  
  

输入

  CET
代码
  #include<iostream>
using namespace std;
  string s;
int main(){
  getline(cin,s);
  for(int i=0;s[i];i++)
  {
  	if(i==0){
  		if(s[i]>='a'&&s[i]<='z')
  		s[i]-=32;
  		cout<<s[i];
	  }else{
	  	if(s[i-1]==' ')
	  	{
	  		if(s[i]>='a'&&s[i]<='z')
	  		    s[i]-=32;
	  		    cout<<s[i];
		  }
	  }
  }
  
	return 0;
}

小y的考试

alt alt

这题题意,给定4个选项,优先选出三长一短的选项,也就是说最短的2个长度不能一样,如果一样,那么就选三短一长,也就是说最长的2个不能长度相同,如果都不满足,则输出C

输入

3
A.3.141592653589 
B.2.718281828459 
C.0.618033988749
D.0.577215664901532860
A.wo_shi_cuo_de
B.wo_bu_dui
C.wo_shi_dui_de
D.C_shi_dui_de
A.3.141592653589
B.2.718281828459
C.0.618033988749
D.0.577215664901

输出

 D
B
C                          
代码
  #include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int t;
struct node{
	int len;
	char c;
	bool operator<(const node b){
		return len<b.len;
	}
}s[4];
int main(){
	cin>>t;
	while(t--)
	{
		string a,b,c,d;
		cin>>a>>b>>c>>d;
		s[0].len=a.size();
		s[0].c='A';
		s[1].len=b.size();
		s[1].c='B';
		s[2].len=c.size();
		s[2].c='C';
		s[3].len=d.size();
		s[3].c='D';
		sort(s,s+4);
		if(s[0].len!=s[1].len )cout<<s[0].c<<endl;
		else if(s[2].len!=s[3].len )cout<<s[3].c<<endl;
		else cout<<"C"<<endl;
	}
	return 0;
}                          

字符统计

alt

输入

  Aa0

输出

  3
代码
  #include<iostream>
#include<cstring>
using namespace std;
string s;
bool cnt[200];
int main(){
	cin>>s;
	int res=0;
	for(int i=0;s[i];i++)
	{
		if(s[i]>'0'&&s[i]<'9'||s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')
		{
			if(cnt[s[i]-'0']==0){
				cnt[s[i]-'0']=1;
				res++;
			}
		}
	}
	cout<<res<<endl;
	return 0;
}

Alanyyds

alt

输入

 5
alanyyds
yydsalan
yydsaslan
alantxdy
AlanTxdy                   

输出

 4                   
代码
#include<iostream>
#include<cstring>
using namespace std;
string s;
int n;
int main(){
	
	cin>>n;
	int res=0;
	while(n--)
	{
		cin>>s;
		for(int i=0;s[i];i++)
		{
			if(s[i]>='A'&&s[i]<='Z')
			s[i]+=32;
		}
		int len=s.size() ;
	    for(int i=0;i<len-3;i++)
		{
			if(s.substr(i,4)=="alan")
			{
				res++;
				break;
			}
		 } 
	}
	cout<<res<<endl;
	return 0;
} 

[NOIP2008]笨小猴

alt

输入

  error

输出

 Lucky Word
2 

alt

代码
#include<iostream>
#include<algorithm>
using namespace std;
int cnt[100];
string s;
int main(){
	cin>>s;
	for(int i=0;s[i];i++)
	{
		cnt[s[i]-'a']++;
	}
	sort(cnt,cnt+100);
	int maxn=cnt[99],minn;
	for(int i=0;i<100;i++)
	{
		if(cnt[i]!=0){
			minn=cnt[i];
			break;
		}
	}
	int x=maxn-minn;
	if(x==0||x==1){
		cout<<"NO Answer\n";
		cout<<0<<endl;
		return 0;
	}
	bool f=0;
	for(int i=2;i<x;i++)
	{
		if(x%i==0)
		{
			f=1;
		}
	}
	if(f){
		cout<<"NO Answer\n";
		cout<<0<<endl;
	}else{
		cout<<"Lucky Word\n";
		cout<<x<<endl;
	}
	return 0;
}  

添加逗号

alt

输入

  980364535

输出

  980,364,535
代码
  #include<iostream> 
#include<cstring>
using namespace std;
string s;//创建一个字符串
char res[100];//拿来存新的字符串
int main(){
	cin>>s;
	int len=s.size();
	int cnt=0,k=0;//cnt拿来计数从后面开始数三个数,k从0 开始计数
	for(int i=len-1;i>=0;i--)
	{
		cnt++;
		res[k++]=s[i];
		if(cnt==3){
			res[k++]=',';
			cnt=0;
		}
	}
	if(res[k-1]==',')k--;
	for(int i=k-1;i>=0;i--)
	    cout<<res[i]; 
	
	return 0;
}

Check in

alt

输入

  2
10
bac16-1
bit16-1
bitss16-1
bjfu16-1
bjtu16-1
bnu16-1
buaa16-1
cuc16-1
cugb16-1
google16-1
5
bnu16-1
bnu16-3
bnu16-5
bnu16-2
bnu16-4

输出

  1
  5
代码
  #include<iostream>
using namespace std;
int main(){
	 int t,n;
	 string s;
	 cin>>t;
	 while(t--){
	 	cin>>n;
	 	int cnt=0;
	 	for(int i=0;i<n;i++)
	 	{
	 	   cin>>s;
	 	   if(s.substr(0,6)=="bnu16-")cnt++;
				
		}
		cout<<cnt<<endl;
	 }
	return 0; 
} 

统计单词数

alt

输入

  1
To
to be or not to be is a question
  说明
输出结果表示给定的单词 To 在文章中出现两次,第一次出现的位置为0。 
  2
  to
Did the Ottoman Empire lose its power at that time
  

输出

  1.
  2 0
  2.
  -1
代码
  #include<iostream>
#include<cstring>
using namespace std;
string s1,s2;
int main(){
	cin>>s1;
	getchar();//输入一个换行符
	getline(cin,s2);
	for(int i=0;s1[i];i++)
	{
		if(s1[i]<='Z'&&s1[i]>='A')
		{
			s1[i]+=32;
		}
	}
		for(int i=0;s2[i];i++)
	{
		if(s2[i]<='Z'&&s2[i]>='A')
		{
			s2[i]+=32;
		}
	}
	int res=0,pos=-1;
	int n=s1.size(),m=s2.size();
	if(s2.substr(0,n+1)==(s1+" ")){
		res++;
		pos=0;
	}
	string s3=" "+s1+" ";
	for(int i=0;i<m;i++)
	{
		if(i+n+1<m&&s2.substr(i,n+2)==s3){
			res++;
			if(pos==-1)pos=i+1;
		}
	}
	if(s2.substr(m-n-1,n+1)==" "+s1){
		res++;
		if(pos=-1)pos=m-n+1;
	}
	if(pos==-1)cout<<-1<<endl;
	else cout<<res<<' '<<pos<<endl;
	return 0;
	
}

译码

alt

输入

  2
10
0000000001
15
000021757511222

输出

aaaaab
aaczzzqpq
代码
 #include<iostream>
#include<cstring>
#include<map>
using namespace std;
struct node{
	char c1,c2,c3;
}mp[20000];
int main(){
	int t,n,cnt=0;
    string s;
	cin>>t;
	for(char i='a';i<='z';i++)
		for(char j='a';j<='z';j++)
		    for(char k='a';k<='z';k++)
		    {
		    	mp[cnt++]={i,j,k};
			}
	while(t--)
	{
		cin>>n;
		cin>>s;
		for(int i=0;i<n;i+=5)
		{
			int x=0;
			for(int j=i;j<i+5;j++)
			{
				x=x*10+(s[j]-'0');
			
			}
				cout<<mp[x].c1<<mp[x].c2<<mp[x].c3;
		}
		cout<<endl;
	}
	
	return 0;
}

字符串操作

alt

输入

5 3
wxhak
3 3 h x
1 5 x a
1 3 w g  

alt

代码
#include<iostream>
using namespace std;
int main(){
	int n,m,l,r;
	string s;
	char c1,c2;
	cin>>n>>m;
	cin>>s;
	while(m--)
	{  
	cin>>l>>r>>c1>>c2;
		for(int i=l-1;i<r;i++)//因为长度总共是5然后她有r有到5的所以下标从1开始
		{  
			if(s[i]==c1)s[i]=c2;
		} 
	}
	cout<<s;
	return 0;
}  

火车上的二连座

        ![alt](https://uploadfiles.nowcoder.com/images/20240520/486182541_1716206801550/D2B5CA33BD970F64A6301FA75AE2EB22)

##输入

6
OO|OX
XO|XX
OX|OO
XX|OX
OO|OO
OO|XX
4
XO|OX
XO|XX
OX|OX
XX|OX
5
XX|XX
XX|XX
XO|OX
XO|OO
OX|XO            

alt

图书管理员

alt

输入

5 5
2123
1123
23
24
24
2 23
3 123
3 124
2 12
2 12

alt

代码
#include<iostream>
#include<cmath>
#include<algorithm> 
using namespace std;
int n,q,len;
int a[1010];
int s;

int main(){
   cin>>n>>q;
   for(int i=0;i<n;i++)
   {
   	cin>>a[i];
	 }  
	sort(a,a+n);//把输入的编号从小到大排序
	while(q--){//有q个学生
		cin>>len>>s;//len是读者需要的书的编号
		int mod=pow(10,len);
		bool f=0;
		for(int i=0;i<n;i++)
		{
		  if(a[i]%mod==s){
		  	cout<<a[i]<<endl;
		  	f=1;
		  	break;
		  }
		}
		if(!f)cout<<-1<<endl;
	}

		return 0;
}

字符串的分类

alt

输入

6
aaa aaa bb aab aa  bb                             

输出:4;

代码
 #include<iostream>
#include<string>
#include<map> 
using namespace std;
int n;
string s;
map<string,bool>mp;
int main(){
 cin>>n;
 int res=0;
 for(int i=0;i<n;i++)
 {
 	cin>>s;
 	if(mp.count(s)==0)
 	{
 		res++;
 		mp[s]=1;
	 }
 }
 cout<<res<<endl;
		return 0;
}

谁拿的奖学金多

alt

输入

  4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1

alt

代码
  #include<iostream>
#include<cstring> 
using namespace std;
struct node{
	string s;//名字
	int sc1,sc2,cnt;
	char c1,c2; 
	
}a[200];
int n;
int main(){
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i].s>>a[i].sc1>>a[i].sc2>>a[i].c1>>a[i].c2>>a[i].cnt;
		
	}
	int ssum=0;
	string name;
	int res;
	for(int i=0;i<n;i++)
    {  int sum=0;
    if(a[i].sc1>80&&a[i].cnt>=1)sum+=8000;
    if(a[i].sc1>85&&a[i].sc2>80)sum+=4000;
    if(a[i].sc1>90)sum+=2000;
    if(a[i].sc1>85&&a[i].c2=='Y')sum+=1000;
    if(a[i].sc2>80&&a[i].c1=='Y')sum+=850;
    ssum+=sum;
    if(sum>res){//sum>=res就会取到后面出现的那位而不是先出现的那位
    	name=a[i].s;
    	res=sum;
	}
	 }  
    
     cout<<name<<endl<<res<<endl<<ssum<<endl;
	return 0;
} 
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务