(寒假GYM开黑)2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)
Posted luowentao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(寒假GYM开黑)2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)相关的知识,希望对你有一定的参考价值。
layout: post
title: 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces
B.Baby Bites (签到模拟)
按照题意模拟就行了
int a[maxn];
string s;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int n;
cin>>n;
int st=-1;
int ed=-1;
int isok=0;
for(int i=1;i<=n;i++){
cin>>s;
if(s[0]=='m')a[i]=i;
else{
if(st==-1)st=i;
int len=s.size();
int num=0;
for(int j=0;j<len;j++)num=num*10+s[j]-'0';
a[i]=num;
if(a[i]==0){
ed=1;
}
}
}
for(int i=1;i<=n;i++){
if(a[i]!=i){cout<<"something is fishy"<<endl;return 0;}
}
cout<<"makes sense"<<endl;
return 0;
}
C.Code Cleanups (贪心)
题意
A[i]天会出现一个垃圾,如果不清扫每天都会+1个垃圾.不能超过20个垃圾不清扫,问你最少清扫几次
题解
直接贪心取就完事了
int a[maxn];
int vis[maxn];
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],vis[a[i]]=1;
int ans=0,now=0,cnt=0;
for(int i=1;i<=365;i++){
now+=cnt;
if(now>=20)ans++,now=cnt=0;
if(vis[i])cnt++;
}
if(now||cnt)ans++;
cout<<ans<<endl;
return 0;
}
E.Explosion Exploit (记忆化搜索)
题意
给定N个自己人,M个敌人。以及每个人的血量ai。系统一共发起K次攻击,每次随机选择一个人物进行攻击,被攻击后血量少1,血量为0的不再考虑。问最后敌人都被杀死的概率。 (N,M<=5 ,ai<=6,K<=100)
题解
用位数模拟血量的人数,最多12位,所以数组开不下,只能用map储存,保存每个血量/国营的人数,概率就是,射中这个人的射中这个人的概率*射中这个人能全部杀掉的概率;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e5+50;
const int logmaxn=20;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
map<ll,double>mp;
ll a[2][8];
int n,m,d;
ll get(){
ll ans=0;
for(int i=1;i<=6;i++)ans=ans*10+a[1][i];
for(int i=1;i<=6;i++)ans=ans*10+a[0][i];
return ans;
}
double dfs(ll sta,int num){
if(mp.count(sta))return mp[sta];
if(sta<1000000)return 1;
if(num==0)return 0;
int sum=0;
for(int i=0;i<2;i++)for(int j=1;j<=6;j++)sum+=a[i][j];
double ans=0;
for(int i=0;i<2;i++)
for(int j=1;j<=6;j++){
if(!a[i][j])continue;
a[i][j]--;a[i][j-1]++;
ll nex=get();
double res=dfs(nex,num-1);
a[i][j]++;a[i][j-1]--;
ans+=(double)(a[i][j]*1.0/sum*1.0)*res*1.0;
}
mp[sta]=ans;
return ans;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
cin>>n>>m>>d;
for(int i=0;i<2;i++){
int k=(i==0?n:m);
for(int j=0;j<k;j++){
int p;cin>>p;a[i][p]++;
}
}
cout<<fixed<<setprecision(8)<<dfs(get(),d)<<endl;
return 0;
}
H.House Lawn ()
solve by 许老师
#include<bits/stdc++.h>
#define db double
#define ll long long
using namespace std;
const int maxn=1e6+6,inf=1e9;
char str[1005];
struct node
{
char s[65];
int id,p;
bool operator<(const node&t)const
{
if(p==t.p)return id<t.id;
return p<t.p;
}
}a[105];
void gao(int cur,int &pri,int &c,int &t,int &r)
{
int n=strlen(str),i=0;
pri=c=t=r=0;
while(str[i]!=',')i++;
i++;
while(str[i]!=',')
pri=pri*10+str[i++]-'0';i++;
while(str[i]!=',')
c=c*10+str[i++]-'0';i++;
while(str[i]!=',')
t=t*10+str[i++]-'0';i++;
while(i<n)
r=r*10+str[i++]-'0';
}
int main()
{
int e,m,pri,c,t,r,v,n=10080,cnt=0;
cin>>e>>m;
getchar();
for(int i=1;i<=m;i++)
{
gets(str);
gao(i,pri,c,t,r);
v=n/(t+r)*t*c;
if(v<e)
{
int tmp=n%(t+r);
db v1=(db(e)-v)/c,v2=tmp-v1;
if(v1<=(db)t)
if(v1*r<=v2*t)v=e;
}
if(v>=e)
{
a[++cnt].p=pri; a[cnt].id=i;
int len=strlen(str),j=0;
while(str[j]!=',')
a[cnt].s[j]=str[j],j++;
a[cnt].s[j]='