链接: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; } }