A. Elections
题目:![](https://i-blog.csdnimg.cn/blog_migrate/66d642918bfabfeeb17a9ad43fe103c4.png)
思路分析:
题意就是3个人有自己的分数 那么各自要增加多少分才能比其他二个人分数都高呢
代码实现:
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
using namespace std;
const int MAX=2e5+10;
int t;
ll a,b,c;
int main(){
cin>>t;
while (t--) {
cin>>a>>b>>c;
ll x=-0x3f3f3f3f;
x=max(x,a);
x=max(x,b);
x=max(x,c);
int id=1;
int sum=0;
if(a==x){
sum++;
}
if(b==x){
sum++;
id=2;
}
if(c==x){
sum++;
id=3;
}
if(sum==3){
cout<<1<<" "<<1<<" "<<1<<endl;
}
else if(sum==2){
if(a==x){
cout<<1<<" ";
}
else cout<<x-a+1<<" ";
if(b==x){
cout<<1<<" ";
}
else cout<<x-b+1<<" ";
if(c==x){
cout<<1<<endl;
}
else cout<<x-c+1<<endl;
}
else if(sum==1){
if(id==1){
cout<<0<<" "<<x+1-b<<" "<<x+1-c<<endl;
}
else if(id==2){
cout<<x+1-a<<" "<<0<<" "<<x+1-c<<endl;
}
else {
cout<<x+1-a<<" "<<x+1-b<<" "<<0<<endl;
}
}
}
}
C. Save More Mice
题目:![](https://i-blog.csdnimg.cn/blog_migrate/1b6c79a3104028faacb566e2c4d19956.png)
思路分析:
题意就是给定终点 和每个人的坐标点
然后贪心法 我们要使到达终点的人最多就是先把坐标排序 让离终点最近的人先到达就行
然后时间为n 计算就行
代码实现:
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
using namespace std;
const int MAX=4e5+10;
ll a[MAX];
int t;
ll n;
int k;
int main(){
t=read();
while (t--) {
n=read();
k=read();
for(int i=0;i<k;i++) cin>>a[i];
sort(a,a+k);
ll now=n;
ll ans=0;
for(ll i=k-1;i>=0;i--){
if(now>n-a[i]){
now-=(n-a[i]);
ans++;
// cout<<now<<" "<<a[i]<<endl;
}
else break;
}
cout<<ans<<endl;
}
}
D1. All are Same
题目:![](https://i-blog.csdnimg.cn/blog_migrate/c35a88692b2f3aee2b2af1d841b714b0.png)
思路分析:
题意就是给定一组数据然后通过一系列操作可以对每个数都减去k
最后让他们全部相等
求这个最大可能数
可以直接暴力过 最大边界就是 最大数-最小数 然后遍历
还可以从 最大数-最小数 为结果然后对每个数-目标值 与其求gcd
如果最后ans为0那就无法实现
代码实现:
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
int gcd(int m, int n){return n == 0 ? m : gcd(n, m%n);}
using namespace std;
const int MAX=45;
int a[MAX];
int t;
int n;
void solve(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int ans=a[n-1]-a[0];
for(int i=0;i<n;i++){
if(a[i]!=a[0]) ans=gcd(ans,a[i]-a[0]);
}
if(ans==0) {cout<<-1<<endl;return;}
cout<<ans<<endl;
}
int main(){
cin>>t;
while (t--) {
solve();
}
}
E. Gardener and Tree
题目:![](https://i-blog.csdnimg.cn/blog_migrate/c0b1ba404b318df7714ff9e1745c15a8.png)
思路分析:
就是给你也可无根树 然后每次操作都要剪去其叶节点 问k次操作以后 还剩多少个节点
我们可以利用拓扑排序的思路
记录下每个节点的度 然后先将度为1的点放入队列中 然后bfs删除与其相连的边并检测其度如果为1那么删除节点放入队列中 同时维护bfs的层数 注意要剪枝 操作数为k
代码实现:
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
int gcd(int m, int n){return n == 0 ? m : gcd(n, m%n);}
using namespace std;
const int MAX=4e5+10;
int t;
int n,k;
vector<int>v[MAX<<1];
int in[MAX];
int vis[MAX];
void solve(){
cin>>n>>k;
int ans=0;
for(int i=1;i<=n;i++){
v[i].clear();
}
mms(vis,0);
mms(in,0);
for(int i=0;i<n-1;i++){
int a,b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1;i<=n;i++){
in[i]=v[i].size();
}
queue<int>q;
for(int i=1;i<=n;i++){
if(in[i]<=1){ //debug1
q.push(i);
ans++;
vis[i]=1;
}
}
while (!q.empty()) {
int p=q.front();
q.pop();
if(vis[p]>=k) continue;
for(int i=0;i<v[p].size();i++){
int u=v[p][i];
if(vis[u]) continue;
in[u]--;
if(in[u]==1){
vis[u]=vis[p]+1;
ans++;
q.push(u);
}
}
}
cout<<n-ans<<endl;
}
int main(){
cin>>t;
while (t--) {
solve();
}
return 0;
}
B. Make it Divisible by 25
题目:
思路分析:
就是给你一个数字 经过一系列操作让其可以被25整除
我们知道可以被25整除的数 末尾2为 只能是 00 25 50 75
那么我们可以先找到0 然后往前找0或者5 记录0或5的下标
也可以先找到5 然后往前找2或者5 记录2或5的下标
他的代价就是n-i-2
取最小就行
代码实现:
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
int gcd(int m, int n){return n == 0 ? m : gcd(n, m%n);}
using namespace std;
const int MAX=4e5+10;
int t;
void solve(){
string s;
cin>>s;
int a,b;
int l=-1;
int r=-1;
for(int i=s.size()-1;i>=0;i--){
if(r==-1&&s[i]=='0'){
r=i;
continue;
}
if(r!=-1&&(s[i]=='0'||s[i]=='5')){
l=i;
break;
}
}
int n=s.size();
a=n-l-2;
l=-1;
r=-1;
for(int i=s.size()-1;i>=0;i--){
if(r==-1&&s[i]=='5'){
r=i;
continue;
}
if(r!=-1&&(s[i]=='2'||s[i]=='7')){
l=i;
break;
}
}
b=n-l-2;
// cout<<a<<" "<<b<<endl;
cout<<min(a,b)<<endl;
}
int main(){
cin>>t;
while (t--) {
solve();
}
return 0;
}