文章目录
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;
}