A-牛牛的装球游戏
求装入最大数量球的剩余体积。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const double PI=3.141592653589;
int main()
{
//圆柱体的体积为PI*r^2*h
//球体的体积为4/3*PI*r^3
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
int r,h;
cin>>r>>h;
int num=h/(2*r);
printf("%.3lf\n",PI*r*r*h-num*r*r*r*PI*4/3);
}
return 0;
}
B-牛牛的数字集合
牛牛想使得最后分成的m个集合的价值和最小,定义每个集合的价值为:集合中数的乘积的m次方。
直接放在一个集合就好。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const LL mod=1e9+7;
LL a[2002000];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int n;
cin>>n;
LL res=1;
for(LL i=1;i<=n;i++)
{
cin>>a[i];
res=(res*a[i])%mod;
}
cout<<res%mod<<endl;
return 0;
}
C-小猫排队
题目大意:啾啾前面有n只小猫,每次小猫能跳向离它最近的比它可爱度大的位置,(先跳跃,再计入时间),问排到它的最少时间是多少?
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
#include<queue>
#include<vector>
using namespace std;
int a[200200];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int x;
cin>>x;
vector<int> v;
for(int i=n;i>=1;i--)
if(a[i]>x) v.push_back(i);
//for(int i=0;i<v.size();i++) cout<<v[i]<<" ";
if(v.size()==0) cout<<n+1<<endl;
else{
int idx=0,flag=0;
for(int i=0;i<v.size();i++)
{
if(v[i]>=i+1)
idx=i,flag=(v[i]-i);
else break;
}
cout<<idx+flag<<endl;
}
return 0;
}
D-造桥
n个字符串能拼接的最大字符串长度(string 1尾和string 2头相同可相连)。
第一反应就是最长上升子序列,老老实实套模板真的出来了
结果tle了,只能过88.46%的样例
tle版本
//和acwing1117单词接龙好像
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;
string s[200200];
int dp[200200];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
//for(int i=1;i<=n;i++) cout<<s[i][s[i].size()-1];
int maxn=0;
for(int i=1;i<=n;i++)
{
int len=s[i].size();
dp[i]=len;
//cout<<dp[i]<<endl;
for(int j=1;j<i;j++)
if(s[j][s[j].size()-1]==s[i][0]) dp[i]=max(dp[j]+len,dp[i]);
if(dp[i]>maxn) maxn=dp[i];
}
cout<<maxn<<endl;
}
return 0;
}
每次两个for for行不通的话,就该想到用一个for了,每次都不够的思维,嗐,我还是太菜了
佬们的ac方法:
(debug de了半天,没初始化!)
是字符串尾巴已经包含的长度更长呢?还是加上这个字符串更长呢?
从这两个方案中选取最大的那个赋值给字符串尾巴,表示在之后的对比中他已经把这个字符串取舍好了。
//和acwing1117单词接龙好像
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cstdio>
using namespace std;
int dp[200200];
char s[200200];
int main()
{
//cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<=30;i++) dp[i]=0;
int maxn=0;
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
int len=s.size();
int x=s[0]-'a';
int y=s[len-1]-'a';
//cout<<x<<" "<<y<<endl;
dp[y]=max(dp[y],dp[x]+len);
//cout<<dp[y]<<endl;
maxn=max(maxn,dp[y]);
}
cout<<maxn<<endl;
}
return 0;
}