C 提交 MLE 了一次,原因是找到答案没加感叹号
A. Zhan’s Blender
题意
原题描述还是不太清楚
你有 n n n 个水果,每秒可以放入搅拌机 y y y 个水果,搅拌机每秒可以搅拌 x x x 个水果,问最终至少需要多少秒能搅完?
注意,可以同步进行,如第一秒时候,我们可以放如 3 3 3 个,搅拌机搅了 1 1 1 个
思路
工作时间 = 工作总量 工作效率 工作时间=\frac{工作总量}{工作效率} 工作时间=工作效率工作总量
当 x ≥ y x \ge y x≥y 时,工作效率取决于 y y y
否则取决于 x x x
则工作效率为 min ( x , y ) \min(x,y) min(x,y)
所以最终答案为 ⌈ n min ( x , y ) ⌉ \displaystyle \lceil\frac{n}{\min(x,y)} \rceil ⌈min(x,y)n⌉
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int inf=2e9;
const int MOD=998244353;
const int maxn=200005;
void solve(){int n,x,y;cin>>n>>x>>y;int p=min(x,y);cout<<(n+p-1)/p<<endl;
}
int main(){int t;cin>>t;while(t--){solve();}return 0;
}
B. Battle for Survive
题意
n n n 个战士,第 i i i 个评分 a i a_i ai,共 n − 1 n-1 n−1 场比赛,每次比赛你可以选择 i , j ( 1 ≤ i < j ≤ n ) i,j\ (1 \le i < j \le n) i,j (1≤i<j≤n),此时 i i i 战败消失, j j j 的评分需要减去 a i a_i ai,问最终剩下的那个战士的评分的 最大值
输入的 a i a_i ai 是正整数,但每次比赛结束后 a j a_j aj 可以变为负数
思路
因为 i < j i<j i<j 可得,最终剩下的战士一定是最右边的
那么贪心思路如下:
要使得最右边的大,它减去的值就要尽可能小,所以左边 n − 1 n-1 n−1 个的最终值尽可能小;
因为 a i a_i ai 为正整数,所以左边 n − 1 n-1 n−1 个最小为 a n − 1 − a n − 2 − . . . − a 1 a_{n-1}-a_{n-2}-...-a_1 an−1−an−2−...−a1
那么最终答案为 a n − ( a n − 1 − a n − 2 − . . . − a 1 ) a_n-(a_{n-1}-a_{n-2}-...-a_1) an−(an−1−an−2−...−a1)
C++ 代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){int n;cin>>n;vector<int> v(n);for(int i=0;i<n;i++){cin>>v[i];}int ans=v[n-2];for(int i=n-3;i>=0;i--){ans-=v[i];}cout<<v[n-1]-ans<<endl;
}
signed main(){int t;cin>>t;while(t--){solve();}return 0;
}
C. Password Cracking
题意
本题为 交互题
有一个长度为 n n n 的 01字符串,每次你可以询问任意一个 01字符串 是不是这个串的子串,若是回应 1
,否则回应 0
询问最多 2 n 2n 2n 次,每次格式为 ? t
思路
不管位置,只要存在就一直往下问。
每次分别询问当前串 + 0
和 + 1
,哪个是加哪个。若都不是,说明到最后了,开始往前找
最后输出即可
C++ 代码
#include<bits/stdc++.h>
using namespace std;bool query(string t){cout<<"? "<<t<<endl;bool res;cin>>res;return res;
}void solve(){int n;string s="0";cin>>n;bool flag=true; //flag 表示当前串是否已经到了结尾,到了为false,往前找;没到为true,往后找bool tmp=query("0");//特殊情况判断if(!tmp){s="";while(n--){s+="1";}cout<<"! "<<s<<endl;return;}for(int i=2;i<=n;i++){if(flag){bool f1=query(s+"0");bool f2=query(s+"1");if(f1){s+="0";}else if(f2){s+="1";}else{flag=false;bool p=query("0"+s);if(!p){s="1"+s;}else{s="0"+s;}}}else{bool fl=query("0"+s);if(fl){s="0"+s;}else{s="1"+s;}}}cout<<"! "<<s<<endl;
}int main(){int tt;cin>>tt;while(tt--){solve();}return 0;
}