训练营
随机序列 问题:
随机序列代码
#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;
}
计数问题
我的代码:我的问题: 代码太繁琐了,
#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约瑟夫环 **我的问题:**没有写出来看不懂题目,不会环状怎么维护
老师的代码:
#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有多少。 代码;
#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;
老师的代码;
#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.看两边的距离离最大或最小的那个距离到最大或者最小的数看哪个最大就可以换,一共四种情况
代码:
#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.在当前的位置的下一个开始比较如果下面的有比当前 的数大就输出那个大的数的下标
代码
#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.
代码:
#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;
}
二进制十进制
代码
#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;
}
序列中整数去重
代码;
#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;
}
有序序列插入一个整数
代码;
#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;
}
打印质数表
代码
#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;
}
质数分布
代码
#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;
}
有序序列合并
我的代码
段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起
#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;
}
杨辉三角
代码
#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;
}
矩形元素定位
代码
#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;
}
上三角矩阵判断
代码
#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;
}
扫雷
代码
#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;
}
矩阵转置
代码
#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的矩阵
代码
#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
输入
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的子字符串;
李在赣神魔
## 输入:
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;
}
数独合理吗?
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;
}
蛇形矩阵
事例
输入: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;
}
竞赛技巧
样例输入
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;
}
明明的随机数
输入
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的排序题
输入
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]分数线划定
输入:
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]奖学金
输入:
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;
}
斗兽棋
输入:
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
代码
#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
简写单词
用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的考试
这题题意,给定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;
}
字符统计
输入
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
输入
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]笨小猴
输入
error
输出
Lucky Word
2
代码
#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;
}
添加逗号
输入
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
输入
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;
}
统计单词数
输入
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;
}
译码
输入
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;
}
字符串操作
输入
5 3
wxhak
3 3 h x
1 5 x a
1 3 w g
代码
#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
图书管理员
输入
5 5
2123
1123
23
24
24
2 23
3 123
3 124
2 12
2 12
代码
#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;
}
字符串的分类
输入
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;
}
谁拿的奖学金多
输入
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
代码
#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;
}