Codeforces Round #590 (Div. 3) 题解


A. Equalize Prices Again(模拟 签到)

原题链接:A. Equalize Prices Again

题意: 商店有n件商品,每件商品有不同的价格,找出一个最小的价格 price,使得price * n >= sum,sum指的是原来商品价格的总和。

思路: 取平均值,向上取整。

Code1(C++):

#include <iostream>
using namespace std; 
int main(){
	int t;	cin>>t;
	while(t--){
		int n;	cin>>n;
		int a[110];
		int sum=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			sum+=a[i];
		}
		int num=sum/n;
		int ans=0;
		if(num*n<sum)
			ans=num+1;
		else
			ans=num;
		cout<<ans<<endl;
	}
	return 0;
}

Code2(C++):

用ceil()函数,但 ceil() 返回的是向上取整后的浮点数,所以要进行强制类型转换。

#include <iostream>
#include <cmath>
using namespace std; 
int main(){
	int t;	cin>>t;
	while(t--){
		int n;	cin>>n;
		int a[110];
		int sum=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			sum+=a[i];
		}
		int ans=(int)ceil(1.0*sum/n);
		cout<<ans<<endl;
	}
	return 0;
}

Code3(Java):

import java.util.Scanner;
public class Main {
	static int[] a = new int[110];
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int t = in.nextInt();
    	while(t-- >0){
    		int n = in.nextInt();
    		int sum=0;
    		for(int i=1;i<=n;i++){
    			a[i] = in.nextInt();
    			sum+=a[i];
    		}
    		int num=sum/n;
    		int ans=0;
    		if(num*n<sum)
    			ans=num+1;
    		else
    			ans=num;
    		System.out.println(ans);
    	}
	}
}


B1. Social Network (easy version)(模拟)

原题链接:B1. Social Network (easy version)

题意: 有一台能显示至多k条短信的手机,每条短信对应的朋友编号不同,在某天你会收到n条短信。如果某条短信的发件人已存在于屏幕中,则无事发生。否则,如果短信条数已满k条,那么会删去最后一条短信,然后让这条短信显示在屏幕的第一位,其他短信依次后移。求收到n条短信后屏幕的短信情况,并按顺序输出每条短信的发件人

思路: 直接暴力模拟,把屏幕上的短信情况存入数组,符合条件则更新。


Code(C++):

#include <iostream>
using namespace std;
int a[250];
int main(){
	int n,k;
	cin>>n>>k;
	int id,ans=0;
	for(int i=0; i<n; i++){
		cin>>id;
		bool vis=false;		//当前屏幕上有该id则为true,没有id则为false 
		for(int j=1; j<=ans; j++){
			if(id==a[j]){
				vis= true;
				break;
			}
		}
		if(vis==true)		//若当前屏幕上有id,则跳过不管 
			continue;
		if(ans<k)			//若还未达到最大值k,继续添加
			a[++ans] = id;
		else{				//若达到最大值k,依次前移,添加到最后 
			for(int j=1; j<k; j++)
				a[j]=a[j+1];
			a[k]=id;
		}
	}
	cout<<ans<<endl;
	for(int i=ans;i>=1;i--)	//逆序输出 
		cout<<a[i]<<" ";
	return 0;
}

Code(Java):

import java.util.Scanner;
public class Main {
	static int[] a = new int[250];
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int k = in.nextInt();
		int ans=0;
		for(int i=0; i<n; i++){
			int id = in.nextInt();
			boolean vis=false;		//当前屏幕上有该id则为true,没有id则为false 
			for(int j=1; j<=ans; j++){
				if(id==a[j]){
					vis= true;
					break;
				}
			}
			if(vis==true)		//若当前屏幕上有id,则跳过不管 
				continue;
			if(ans<k)			//若还未达到最大值k,继续添加
				a[++ans] = id;
			else{				//若达到最大值k,依次前移,添加到最后 
				for(int j=1; j<k; j++)
					a[j]=a[j+1];
				a[k]=id;
			}
		}
		System.out.println(ans);
		for(int i=ans;i>=1;i--)	//逆序输出 
			System.out.print(a[i] + " ");
	}
}


B2. Social Network (hard version)(加强版)

原题链接: B2. Social Network (hard version)

思路: 数据加强了,变为2e5,直接暴力模拟肯定TLE。用STL容器来做能节省很多时间。map用来标记数是否出现在屏幕上,vector用来维护数组,即屏幕上的数。

Code(C++):

#include <iostream>
#include <map>
#include <vector>
typedef long long ll;
using namespace std;
int main(){
	int k,n;
	int a[200100];
	cin>>n>>k;
	vector<int> v;
	map<int,int> m;		//标记该数显示在屏幕上,全部初始化为为0 
	for(int i=0;i<n;i++){
		cin>>a[i];
        if(m[a[i]]==0){	//0表示该数没显示在屏幕上 
             v.push_back(a[i]);
             m[a[i]]=1;	//1表示该数显示在屏幕上 
        }
        else 
			continue;
        if(v.size()>k){
			m[v[0]]=0; 
			v.erase(v.begin());
		}
    }
	cout<<v.size()<<endl;
	for(int i=v.size()-1;i>=0;i--)
	    cout<<v[i]<<" ";
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值