A贪心
题意:
思路:贪心,每次放木板时,留一个位置放金,其余放银,每次容器的容积-1
每次放银的数量构成等差数列,所以放x个金木板时银木板数可以用前x项和来求;
再判断剩余容积能否放下剩余的银
#include <bits/stdc++.h>
#define lowbit(x) x&(-x)
#define ios std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
using namespace std;
ll x,y,z;
void solve()
{
cin>>x>>y>>z;
if(x>z) puts("Merry");
else if(x==z&&y!=0) puts("Merry");
else if(x==z&&y==0) puts("Renko");
else
{
ll s=(2*z-x-1)*x/2;
z-=x;y-=s;
if(z>=y) puts("Renko");
else puts("Merry");
}
}
int main()
{
//ios;
int _t=1;
cin>>_t;
while(_t--)
{
solve();
}
system("pause");
return 0;
}
B思维
题意:
思路:i->j的边权=ai-2*aj+c,要使边权小就要让ai小,aj大
又因为求简单路径,按集合内的点从小到大走即可
#include <bits/stdc++.h>
#define lowbit(x) x&(-x)
#define ios std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
using namespace std;
ll n,c,q;
ll a[N];
ll t[N];
void solve()
{
cin>>n>>c>>q;
for(int i=1;i<=n;i++) cin>>a[i];
while(q--)
{
int s;
cin>>s;
int cnt=0;
for(int i=1;i<=s;i++)
{
int idx;
cin>>idx;
t[++cnt]=a[idx];
}
sort(t+1,t+s+1);
ll ans=(s-1)*c;
for(int i=1;i<s;i++)
{
ans+=t[i]-2*t[i+1];
}
cout<<ans<<'\n';
}
}
int main()
{
ios;
int _t=1;
//cin>>_t;
while(_t--)
{
solve();
}
system("pause");
return 0;
}
C拓扑&二分图
题意:
思路: 对于边<u,v>,当点u的度为1时,那么与u配对的一定是v,用vis表示已经确定点的集合,然后删掉v的所有连边,将度为1的点入队;不断重复此过程,当确定的点个数cnt==n时,那么就是完美匹配。
因此我们按照拓扑的思路,每次选择度数为1的点进行删边和点。
#include <bits/stdc++.h>
#define lowbit(x) x&(-x)
#define ios std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
using namespace std;
int n,m;
int in[N*2];
bool vis[N*2];
vector<int>mp[N*2];
void solve()
{
memset(in,0,sizeof in);
memset(vis,0,sizeof vis);
for(int i=1;i<=N*2;i++) mp[i].clear();
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
v+=n;
in[u]++;
in[v]++;
mp[u].push_back(v);
mp[v].push_back(u);
}
queue<int>q;
for(int i=1;i<=n*2;i++)
{
if(in[i]==1) q.push(i);
}
int cnt=0;
while(!q.empty())
{
auto u=q.front();
q.pop();
if(vis[u]||in[u]!=1) continue;
in[u]--;
cnt++;
for(auto i:mp[u])
{
if(in[i]==1&&!vis[i])
{
vis[i]=1;
in[i]--;
}
else if(!vis[i])
{
for(auto j:mp[i])
{
in[i]--;
in[j]--;
vis[i]=1;
if(!vis[j]&&in[j]==1) q.push(j);
}
}
}
}
if(cnt==n) puts("Renko");
else puts("Merry");
}
int main()
{
//ios;
int _t=1;
cin>>_t;
while(_t--)
{
solve();
}
system("pause");
return 0;
}