(https://ac.nowcoder.com/acm/contest/92972)(比赛链接)
目录
A.超市
1.思路
只买两个水果中更便宜的那一种水果就可以了
2.代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int n,a,b;
cin>>n>>a>>b;
int min1 = min(a,b);
cout<<n/min1<<endl;
return 0;
}
B.雨幕
1.思路
for循环对于每个点进行2*2区域判断即可
2.代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3+7;
char a[N][N];
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int count=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m-1;j++){
if(a[i][j]=='*'&&a[i+1][j]=='*'&&a[i][j+1]=='*'&&a[i+1][j+1]=='*'){
count++;
}
}
}
cout<<count<<endl;
return 0;
}
C.闺蜜
1.思路
因为小紫可以置换一次手牌,所以,小紫一定会选择将自己最小的手牌跟小红最大的手牌置换。对于数组所有数据,从小到大排序,小紫获得的手牌为a1、a3、...、an-1,而小红获得的手牌为a2、a4、...、an,并且置换a1、an,最后判断即可
但可以通过数学证明,小红不可能取胜,顶多打平。若数组的最大值和最小值相等,则平局,否则的话,小紫通过置换最大值和最小值的优势,小红每次取牌获取的优势总和难以大于小紫通过置换的优势,小紫获胜
2.代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3+7;
int a[N];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int hong = 0;
int zi = 0;
for(int i=2;i<=n-2;i+=2){
hong+=a[i];
zi+=a[i+1];
}
zi+=a[n];
hong+=a[1];
if(zi>hong){
cout<<"yukari"<<endl;
}else if(zi==hong){
cout<<"draw"<<endl;
}else{
cout<<"kou"<<endl;
}
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
}
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3+7;
int a[N];
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
if(a[1]==a[n]){
cout<<"draw"<<endl;
}else{
cout<<"yukari"<<endl;
}
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
}
D.医生
1.思路
将每个病人的情况以及药物的情况以十进制的方式进行储存。暴力枚举所有的情况,总共有2^k种情况,对于每种情况,当以二进制的方式存储的时候,对应位置的值为1,说明选择该种药物,将药物添加到x中,若(x&a[i])==a[i],说明能治愈该病人,则进行ans的更新,最后输出最小的ans即可
2.代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e4+7;
int a[N],b[N];
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int j=0;j<m;j++){
if(s[j]=='1'){
a[i] |= (1<<j);
}
}
}
int k;
cin>>k;
for(int i=1;i<=k;i++){
string s;
cin>>s;
for(int j=0;j<m;j++){
if(s[j]=='1'){
b[i] |= (1<<j);
}
}
}
for(int i=1;i<=n;i++){
int ans = 0x3f3f3f;
for(int t=0;t<(1<<k);t++){
int x = 0;
int count = 0;
for(int j=0;j<k;j++){
if(t>>j&1){
x |= b[j+1];
count++;
}
}
if((x&a[i])==a[i]){
ans = min(ans,count);
}
}
if(ans==0x3f3f3f){
ans = -1;
}
cout<<ans<<endl;
}
return 0;
}
E.F.降温
1.思路
利用两个数组来保存最大寒潮和最小寒潮对应的温度情况。并且对于未知的气温,最大寒潮:若能和前一天达成寒潮则进行x的降温,否则升至最大气温,尽可能满足之后的寒潮情况;最小寒潮:尽可能去降温,减少寒潮的次数,若能和前一天正好达成不是寒潮的情况,则降温(x-1),否则直接降至最低温
2.代码(以F题为准,两题只需修改数据范围)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+7;
const int temp = 5e8;
const int wz = -999999999;
int a[N],b[N];
int cta=0,ctb=0;
signed main(){
int n,x;
cin>>n>>x;
for(int i=1;i<=n;i++){
int t;
cin>>t;
a[i] = t;
b[i] = t;
}
if(a[1]==wz){
a[1] = temp;
b[1] = -temp;
}
for(int i=2;i<=n;i++){
if(a[i]==wz){
if(a[i-1]-x<-temp){
a[i] = temp;
}else{
a[i] = a[i-1]-x;
}
b[i] = max(b[i-1]-(x-1),-temp);
}
if(a[i-1]-a[i]>=x){
cta++;
}
if(b[i-1]-b[i]>=x){
ctb++;
}
}
cout<<cta<<" "<<ctb<<endl;
return 0;
}
G.乌鸦
偶不会,待补。。