第一题链接:拿硬币
第一题基本上算是白送的,只要进行奇偶判断就行
class Solution {
public:
int minCount(vector<int>& coins) {
int ans=0;
for(int i=0;i<coins.size();i++)
{
if(coins[i]%2==0)
{
ans+=coins[i]/2;
}
else
{
ans+=coins[i]/2;
ans++;
}
}
return ans;
}
};
第二题链接:传递信息
第二题当时想到的就是利用邻接矩阵来做,居然还是能过了,难点主要是对于矩阵的幂运算,这里应该还能进行优化,但是直接提交还是能够双100%
class Solution {
public:
vector<vector<int>> Mult(vector<vector<int>> a,vector<vector<int>> b) {
int n = a.size(), m = a[0].size(), p = b[0].size();
vector<vector<int> > result(n,vector<int>(n,0));
for(int i=0; i<n; i++) {
for(int j=0; j<p; j++) {
for(int k=0; k<m; k++) {
result[i][j] += a[i][k] * b[k][j];
}
}
}
return result;
}
int numWays(int n, vector<vector<int>>& relation, int k) {
vector<vector<int>>g(n,vector<int>(n,0)),ans;
for(int i=0;i<relation.size();i++)
{
g[relation[i][0]][relation[i][1]]++;
}
ans=g;
for(int i=1;i<k;i++)
{
ans=Mult(ans,g);
}
return ans[0][n-1];
}
};
第三题链接:剧情触发时间
这题当时没有想到用二分的方法来做,着实大意了,写完暴力模拟后才发现会超时,所以就卡住了:
先贴一个当时写的会超时的代码:
class Solution {
public:
vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
int C=0,R=0,H=0;
vector<int> ans(requirements.size(),-1);
int vis[100000]={
0};
int head=0,temp=1000000;
for(int i=0;i<increase.size();i++)
{
C+=increase[i][0];
R+=increase[i][1];
H+=increase[i][2];
for(int j=head;j<requirements.size();j++)
{
if(C>=requirements[j][0]&&R>=requirements[j][1]&&H>=requirements[j][2]&&!vis[j])
{
if(!i&&!j)
{
vis[j]=-2;
continue;
}
vis[j]=i+1;
}
temp=min(temp,j);
}
head=temp;
}
for(int i=0;i<requirements.size();i++)
{
if(vis[i]==-2)
{
ans[i]=0;
continue;
}
if(vis[i])
{
ans[i]=vis[i];
}
}
return ans;
}
};
正确代码是:
class Solution {
public:
vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
vector<vector<int>> s(increase.size()+1,vector<int>(3,0));
for(int i=0;i<increase.size();i++){
for(int j=0;j<3;j++){
s[i+1][j] = s[i][j] + increase[i][j];
}
}
vector<int> ans;
for(auto v:requirements){
int l=0, r = increase.size();
while(l<r){
int m = (l+r)/2;
if(s[m][0]>=v[0]&&s[m][1]>=v[1]&&s[m][2]>=v[2])
r = m;
else
l = m+1;
}
if(s[l][0]>=v[0]&&s[l][1]>=v[1]&&s[l][2]>=v[2])
ans.push_back(l);
else
ans.push_back(-1);
}
return ans;
}
};