链接:https://www.nowcoder.com/acm/contest/67/A
来源:牛客网
心得:水水水!感觉自己水到爆!
A 大吉大利,今晚吃鸡——枪械篇
思路:
水题一个,暴力枚举,一开始想的是贪心,一直在找贪的条件,浪费不少时间。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#define ll long long
#define maxn 1000000
using namespace std;
struct Node{
int p;
int k;
}node[1005];
int a[1005][1005];
double g[1005];
int n,m;
int q;
double b;
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m){
memset(g,0,sizeof(g));
for(int i=1;i<=n;i++){
cin>>node[i].p>>node[i].k;
for(int j=1; j<=node[i].k; j++)
cin>>a[i][j];
}
for(int k=1;k<=m;k++){
cin>>q>>b;
g[q]=max(g[q],b); //其实同一类型,只保留最大的那个概率即可。
}
double ans;
ans=-1;
double sum=1;
for(int i=1;i<=n;i++){ //枚举一遍,找最大值!
sum=1;
for(int j=1;j<=node[i].k;j++){
sum+=g[a[i][j]];
}
ans=max(ans,node[i].p*(sum));
}
printf("%.4lf\n",ans);
}
return 0;
}
B 最强的决斗者一切都是必然的!
思路:模拟一遍,读懂题意,一段一段的截,然后一段一段的求
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#define ll long long
#define maxn 1000
using namespace std;
struct Node{
int s;
int t;
int num;
}node[1005];
int n;
ll func(int l,int r){
ll ans=r-l+1;
ll sum=0;
for(int i=r; i>=l; i--){
if(node[i].t==1){
sum+=node[i].num;
ans--;
}
else if(node[i].t==2){
sum+=ans*node[i].num;
ans--;
}
else if(node[i].t==3){
break;
}
else if(node[i].t==4){
i--;
ans=ans-2;
}
}
return sum;
}
char s[100];
int main(){
while(cin>>n){
getchar();
for(int i=1;i<=n;i++){
gets(s);
int len=strlen(s);
int a=0,b=0,c=0;
ll sum=0;
for(int j=0;j<len;j++){
if(sum==0){
if(s[j]==' ') sum++;
else a=a*10+s[j]-'0';
}
else if(sum==1){
if(s[j]==' ') sum++;
else b=b*10+s[j]-'0';
}
else if(sum==2){
if(s[j]==' ') break;
else c=c*10+s[j]-'0';
}
}
node[i].s=a;
node[i].t=b;
node[i].num=c;
}
int l,r;
ll sum1=0;
ll ans=0;
l=1;
for(int i=2;i<=n;i++){
if(node[i].s>=node[i-1].s)
sum1++;
else if(node[i].s<node[i-1].s){
ans+=func(l,l+sum1);
// cout<<l<<" "<<l+sum<<"-----"<<endl;
sum1=0;
l=i;
}
}
// cout<<l<<" "<<l+sum<<endl;
ans+=func(l,l+sum1);
cout<<ans<<endl;
}
return 0;
}
F 大吉大利,今晚吃鸡——跑毒篇
思路:找到血量的临界值,6*a到7*a之间时,就要使用血包了,然后在判断血包的数量。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int N=1000+10;
int main()
{
int t,a,b,c,num;
scanf("%d",&t);
while(t--)
{
num=100;
scanf("%d%d%d",&a,&b,&c);
int less=6*a;
while(num>0&&b>0)
{
if(num>less&&num<=less+a&&c>0)
{
num=80;
c--;
}
b--;
if(b<=0)
break;
num-=a;
}
if(num>0&&b<=0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
H 方块与收纳盒
思路:递推!dp[i]=dp[i-1]+dp[i-2];
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#define ll long long
#define maxn 1000000
using namespace std;
ll dp[85];
int main(){
int T;
int n;
cin>>T;
dp[1]=1;
dp[2]=2;
dp[3]=3;
for(int i=4;i<=80;i++)
dp[i]=dp[i-1]+dp[i-2];
while(T--){
cin>>n;
cout<<dp[n]<<endl;
}
return 0;
}
I 找数字个数
思路:模拟一遍,一个一个找
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#define ll long long
#define maxn 1000
using namespace std;
int a,b;
bool vis[16];
void q(int x){
int tem;
while(x!=0){
tem=x%10;
vis[tem]=1;
x/=10;
}
}
bool check(int x){
int tem;
if(x%a==0||x%b==0) return false;
while(x!=0){
tem=x%10;
if(vis[tem]==1){
return false;
}
x=x/10;
}
return true;
}
int main(){
int t;
cin>>t;
while(t--){
memset(vis,0,sizeof(vis));
cin>>a>>b;
q(a);
q(b);
int sum=0;
for(int i=0;i<=1000;i++){
if(check(i)){
sum++;
}
}
cout<<sum<<endl;
}
}