每周习题讲解

1.给你一个长度为 n 的由大写的英文字母组成的字符串,请你找出出现频率最高的长度为2的子串

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
    char a[100];
    int b[27][27];
    char c[2];
int main(int argc, char** argv) {
    int n;
    cin>>n;
  
    for(int i=1;i<=n;i++){
    	cin>>a[i];
	}
	for(int i=1;i<n;i++){
		b[a[i]-'A'+1][a[i+1]-'A'+1]++;
	}
		int m=0;
	for(int i=1;i<n;i++){
	
		if(m<b[a[i]-'A'+1][a[i+1]-'A'+1]){
			
		m=b[a[i]-'A'+1][a[i+1]-'A'+1];
		c[0]=a[i];c[1]=a[i+1];
		}
	}
	cout<<c[0]<<c[1];
	return 0;
}
2.战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳 11 个人通过。假如有 22 个人相向而行在桥上相遇,那么他们 22 个人将无法绕过对方,只能有 11 个人回头下桥,让另一个人先通过。但是,可以有多个人同时呆在同一个位置。
#include <iostream>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;

int main()
{
	int l,n;
	int a[10000],b[10000];
	int x;
	cin>>l>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		a[i]=min(x,l-x+1);
		b[i]=max(x,l-x+1);
	}
    sort(a+1,a+n+1);
    sort(b+1,b+n+1);
    cout<<a[n]<<" "<<b[n];
    return 0;}
3.

超市里有 �(1≤�≤105)n(1n105) 个寄包柜。每个寄包柜格子数量不一,第 i 个寄包柜有 ��(1≤��≤105)ai(1ai105) 个格子,不过我们并不知道各个 ��ai 的值。对于每个寄包柜,格子编号从 1 开始,一直到 ��ai。现在有 �(1≤�≤105)q(1q105) 次操作:

  • 1 i j k:在第 i 个柜子的第 j 个格子存入物品 �(0≤�≤109)k(0k109)。当 �=0k=0 时说明清空该格子。
  • 2 i j:查询第 i 个柜子的第 j 个格子中的物品是什么,保证查询的柜子有存过东西。

已知超市里共计不会超过 107107 个寄包格子,��ai 是确定然而未知的,但是保证一定不小于该柜子存物品请求的格子编号的最大值。当然也有可能某些寄包柜中一个格子都没有

#include<bits/stdc++.h>
using namespace std;
map<int,int>a1[100001];
int n,q;
int main()
{
	cin>>n>>q;
	for(int i=0;i<q;i++)
	{
		int a,b,c,d;
		cin>>a;
		if(a==1)
		{
			cin>>b>>c>>d;
			a1[b][c]=d; 
		}
		else
		{
			cin>>b>>c;
			cout<<a1[b][c]<<endl; 
		}
	}
	return 0;
}
4.

小 K 是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。

小 K 对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第 i 艘到达的船,他记录了这艘船到达的时间 ��ti (单位:秒),船上的乘客数 ��ki,以及每名乘客的国籍 ��,1,��,2,…,��,�xi,1,xi,2,,xi,k

小K统计了 n 艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的 2424 小时(2424 小时 =86400=86400 秒)内所有乘船到达的乘客来自多少个不同的国家。

形式化地讲,你需要计算 n 条信息。对于输出的第 i 条信息,你需要统计满足 ��−86400<��≤��ti86400<tpti 的船只 p,在所有的 ��,�xp,j 中,总共有多少个不同的数。

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n,t,k;
int i=0,r=0;
int a[100001],b[1000001],c[1000001];
int ans;

int main(int argc, char** argv) {
      cin>>n;
      while(n--){
      	
      	cin>>t>>k;
      	while(k--){
      		a[++r]=t;
      		cin>>b[r];
      		if(!c[b[r]])ans++;
      		c[b[r]]++;
		  }
		  
		  while((t-a[i])>=86400){
		  	c[b[i]]--;
		  	if(!c[b[i]])ans--;
		  	i++;
		  	
		  
		  }
		  
		  
		  
		  	cout<<ans<<endl;
	  }
      return 0;
}
5.

一元 n 次多项式可用如下的表达式表示:

�(�)=����+��−1��−1+⋯+�1�+�0,��≠0f(x)=anxn+an1xn1++a1x+a0,an=0

其中,����aixi 称为 i 次项,��ai 称为 i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

  1. 多项式中自变量为 x,从左到右按照次数递减顺序给出多项式。

  2. 多项式中只包含系数不为 00 的项。

  3. 如果多项式 n 次项系数为正,则多项式开头不出 + 号,如果多项式 n 次项系数为负,则多项式以 - 号开头。

  4. 对于不是最高次的项,以 + 号或者 - 号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 00 次的项,其系数的绝对值为 11,则无需输出 11)。如果 x 的指数大于 11,则接下来紧跟的指数部分的形式为“��xb”,其中 b 为 x 的指数;如果 x 的指数为 11,则接下来紧跟的指数部分形式为 x;如果 x 的指数为 00,则仅需输出系数即可。

  5. 多项式中,多项式的开头、结尾不含多余的空格。 

  6. #include<cmath>
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    
    int main(){
        cin>>n;
        int m[n];
    for(int i=n;i>=0;i--){
        cin>>m[i];
    }
    for(int i=n;i>=0;i--){
        if(m[i]==0&&i!=n)cout<<"";
        else if(m[i]>1&&i==n)cout<<m[i]<<"x^"<<i;
        else if(m[i]<-1&&i==n)cout<<m[i]<<"x^"<<i;
        else if(m[i]==1&&i==n)cout<<"x^"<<i;
        else if(m[i]==-1&&i==n)cout<<"-"<<"x^"<<i;
        else if(m[i]>1&&i>1&&i<n)cout<<"+"<<m[i]<<"x^"<<i;
        else if(m[i]==1&&i>1&&i<n)cout<<"+"<<"x^"<<i;
        else if(m[i]<-1&&i>1&&i<n)cout<<m[i]<<"x^"<<i;
        else if(m[i]==-1&&i>1&&i<n)cout<<"-"<<"x^"<<i;//
        else if(m[i]>1&&i==1)cout<<"+"<<m[i]<<"x";
        else if(m[i]==1&&i==1)cout<<"+"<<"x";
        else if(m[i]<-1&&i==1)cout<<m[i]<<"x";
        else if(m[i]==-1&&i==1)cout<<"-"<<"x";
        else if(i==0&&m[i]<0)cout<<m[i];
        else if(i==0&&m[i]>0)cout<<"+"<<m[i];
    
    }
    
    
    return 0;}
    6.

    读入N个整数,利用折半(二分)插入排序法对这些数排序,输出排序后的N个数,两个数之间用空格间隔。

    这里排序指的是升序。

  7. #include<iostream>
    
    using namespace std;
    
    int main(int argc, char** argv) {
        int n;
        cin>>n;
        int a[n+1];int d;
        for(int i=1;i<=n;i++){
        	 cin>>a[i];
    	}
    	for(d=n/2;d>=1;d=d/2){
    	
    	for(int i=2;i<=n;i++){
    		a[0]=a[i];
    		int j=i-d;
    		while(a[0]<a[j]&&j>0){
    			a[j+d]=a[j];
    			j=j-d;
    			
    		}
    		a[j+d]=a[0];
    		
    	}
    	}
    	for(int i=1;i<=n;i++){
    		cout<<a[i]<<" ";
    	}
    	
          return 0;}
    7
    

    读入N个整数,利用冒泡排序法对这些数排序,输出排序后的N个数,两个数之间用空格间隔。

    这里排序指的是升序。

    #include <iostream>
    
    using namespace std;
    template<class T>
    void BubbleSort(T r[],int n){
    	int exchange=n;
    	int bound=0;
    	while(exchange){
    		bound=exchange;
    		exchange=0;
    		for(int i=1;i<bound;i++){
    			if(r[i]>r[i+1]){
    				int tm=r[i];
    				r[i]=r[i+1];
    				r[i+1]=tm;
    				exchange=i;
    			}
    		}
    	}
    }
    int main() {
    	int n;int i;
    	int a[1001];
    	cin>>n;
    	for(i=1;i<=n;i++){
    		cin>>a[i];
    	}
        BubbleSort(a,n);
    	for(int j=1;j<=n;j++){
    		cout<<a[j]<<" ";
    	}
    	return 0;
    }
posted @   炮灰灰灰灰  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示