超市排队结账,每扫描一件商品需要5秒,每个顾客需要15秒付钱。给出每个窗口的人数和每个人买的商品数,求排在最快的队伍时,最少要等多少时间。模拟...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,m,ans;
int a[20000];
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for (int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
ans=99999999;
int x,y,z;
for (int i=1; i<=n; i++)
{
z=0;
for (int j=1; j<=a[i]; j++)
{
scanf("%d",&x);
z+=(x*5);
z+=15;
}
ans=min(z,ans);
}
cout<<ans<<endl;
return 0;
}
P2: Garland
这题其实我没看懂题意,看了看数据,感觉就是统计一下两个串里相同的字符出现了多少次,并且B串中每个字符一定要在A中出现过一次,否则就是-1.
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <cstdio>
using namespace std;
typedef long long ll;
int a[100];
char s[1200],s1[1200],s2[1200];
int n,m,p;
int main()
{
// freopen("in.txt","r",stdin);
gets(s1);
gets(s2);
int l1=strlen(s1);
int l2=strlen(s2);
memset(a,0,sizeof a);
for (int i=0; i<l1; i++)
{
a[s1[i]-'a']++;
}
int ct=0;
bool ok=true;
for (int i=0; i<l2; i++)
{
if (a[s2[i]-'a']==0)
{
ok=false;
break;
}
}
if (ok)
{
for (int i=0; i<l2; i++)
{
if (a[s2[i]-'a']>0)
{
a[s2[i]-'a']--;
ct++;
}
}
}
if (ct>0) cout<<ct<<endl;
else cout<<"-1"<<endl;
return 0;
}
p3: Triangle
给直角三角形的两个边的长度a,b,在平面中找到3个点,使得三个点组成直角三角形并且其中两条边等于所给的两个长度。在第一象限中找到所有符合到原点距离等于a的格点,在第四象限中找到所有符合到原点距离等于b的格点,然后二重循环这两个集合,如果每一组配对可以组成直角,并且y坐标不相等就是一组符合的解。
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
int n,m;
int k,x,y,z;
int p[11000];
bool f[1010000];
int id[1010000];
int a,b;
int ans[5][2];
const int maxn=1000*1000;
int gcd(int x,int y)
{
if (y==0) return x;
return gcd(y,x%y);
}
int dis(int x1,int y1,int x2,int y2)
{
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
struct node
{
int x,y;
node()
{
}
node(int a,int b)
{
x=a; y=b;
}
};
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d",&a,&b);
vector<node>n1,n2;
if (a>b) swap(a,b);
ans[0][0]=0;
ans[0][1]=0;
int x,y,z;
bool ok=false;
for (int i=1; i<=1000; i++)
for (int j=1; j<=1000; j++)
{
if (dis(0,0,i,j)==a*a)
{
n1.push_back(node(i,j));
}
}
for (int i=1; i<=1000; i++)
for (int j=1; j<=1000; j++)
{
if (dis(0,0,i,j)==b*b)
{
n2.push_back(node(i,j));
}
}
for (int i=0; i<n1.size(); i++)
for (int j=0; j<n2.size(); j++)
{
if (n1[i].x*n2[j].x==n1[i].y*n2[j].y && n1[i].y!=n2[j].y)
{
ans[1][0]=n1[i].x;
ans[1][1]=n1[i].y;
ans[2][1]=n2[j].y;
ans[2][0]=-n2[j].x;
ok=true;
i=n1.size();
j=n2.size();
}
if (ok) break;
}
if (ok)
{
puts("YES");
for (int i=0; i<3; i++)
cout<<ans[i][0]<<" "<<ans[i][1]<<endl;
}
else
{
puts("NO");
}
return 0;
}
P4: Long Path
每个点,有两个通道,第一条通道通向i+1,第二条通道通向a[i],现在问要从1到n+1,要走多少次通道。算是个Dp把,记录一下dp[k]为从k到k+1需要穿过多少条通道,那么如果在节点i,有a[i]的话,i到i+1所走的通道数就是dp[a[i],a[i]+1,a[i]+2,...i-1].这样实际上每个点只算一次,然后记录下来下次直接调用就好了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int n,m;
ll dp[3333];
int a[3333];
int x,y,z;
const int mod=1000000007;
ll work(int x,int y)
{
if (x==y) return dp[y]=2;
if (x==0) return x;
ll res=2;
if (dp[y]!=-1) return dp[y];
int k=y;
for (int i=a[k]; i<=k-1; i++)
res+=work(a[i],i);
res%=mod;
dp[y]=res;
return res;
}
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for (int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
ll ans=0;
memset(dp,-1,sizeof dp);
dp[0]=0;
for (int i=1; i<=n; i++)
{
ans+=work(a[i],i);
ans%=mod;
// dp[i]=ans;
// ans++;
}
cout<<ans<<endl;
return 0;
}