Codeforces #350

时间:2023-02-06 22:57:01

A题:

题意:判断火星上的节假日最多和最少

分析:除以7,然后我们对原数模7的余数进行判断一下即可

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
int n;
int main()
{
while(cin>>n)
{
int minx,mx;
int t=n/;
t*=;
if(n%==){
minx=mx=t;
}else if(n%==){
minx=t;
mx=t+;
}else if(n%==){
minx=t+;
mx=t+;
}else{
minx=t;
mx=t+;
}
cout<<minx<<" "<<mx<<endl;
}
return ;
}

B题:

题意:有n个机器人,第i个机器人纪录其前面的i-1个数和其本身,问第k个数是多少

分析:判断一下第k个属于第几个机器人的即可

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
const int maxn=;
long long dp[maxn];
int a[maxn];
int n;
int k;
int main()
{
while(cin>>n>>k)
{
for(int i=;i<n;i++)
cin>>a[i];
int h;
int ans;
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
dp[i]=dp[i-]+i;
if(dp[i]>=k){
h=i; break;
}
}
int flag=;
if(dp[h]==k){
flag=;
}else{
h--; flag=;
}
if(flag) cout<<a[h-]<<endl;
else{
int t=k-dp[h];
//cout<<"t: "<<t<<endl;
cout<<a[t-]<<endl;
}
}
return ;
}

C题:

题意:n个科学家来自不同国家,每个科学家对应懂一种语言,有双语电影,其中声音和文字是不同语言,希望找到一个电影院,让尽可能多的科学家能看懂,如果声音相同的情况比较文字尽量多的

分析:因为数据范围太大,用map进行统计每会说没中语言的科学家的人数,然后进行排序即可

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
const int maxn=;
map<int,int> vis;
typedef struct p
{
int id;
int aud,sub;
}p;
p s[maxn];
bool cmp(p a,p b)
{
if(a.aud==b.aud)
return a.sub>b.sub;
else
return a.aud>b.aud;
}
int main()
{
int n,m;
cin>>n;
for(int i=;i<n;i++){
int x;
scanf("%d",&x);
vis[x]++;
}
cin>>m;
for(int i=;i<m;i++){
int y;
scanf("%d",&y);
s[i].id=i+;
s[i].aud=vis[y];
}
for(int i=;i<m;i++){
int z;
scanf("%d",&z);
s[i].sub=vis[z];
}
sort(s,s+m,cmp);
printf("%d\n",s[].id);
return ;
}

D题:

题意:做一个蛋糕需要n种成份,需要每种成分ai,每种成分有bi,同时还有k个能转换成任意成分的物品,问最多能构成多少物品

分析:可以以bi除以ai为序,然后用一个优先队列进行维护,期间模拟k个物品的情况即可

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
const int maxn=;
typedef struct p
{
int a,b;
int mul,mod;
friend bool operator<(p x,p y){
return x.mul>y.mul;
}
}p;
p s[maxn];
int n,k;
int main()
{
while(cin>>n>>k)
{
for(int i=;i<n;i++)
cin>>s[i].a;
for(int i=;i<n;i++){
cin>>s[i].b;
s[i].mul=s[i].b/s[i].a;
s[i].mod=s[i].b%s[i].a;
}
priority_queue<p> que;
for(int i=;i<n;i++)
que.push(s[i]);
while(true){
p h=que.top();
int t=h.a-h.mod;
k-=t;
if(k<) break;
//cout<<"t: "<<t<<endl;
h.b+=t;
h.mod=h.b%h.a;
h.mul=h.b/h.a;
//cout<<h.mul<<endl;
if(k>=){
que.pop();
que.push(h);
if(k==)
break;
}
}
int z=que.top().mul;
cout<<z<<endl;
}
return ;
}