a.aoe还是单体
题意:给定2个方法,问怎么样能将n个怪物的血量都减成0,消耗mp最少。
题解:第一个方法是消耗1mp,随机使一个怪物血量-1,第二个方法是消耗xmp,使所有怪物血量都-1.所以先排序,只要判断如果x<=n时,把第x个怪物的血量*x,这样就能把x个怪物都变成0,剩下的怪物血量用第一种方法就可以了。
代码:
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,x,sum=0; int a[500000]; int main() { cin>>n>>x; for(int i=0; i<n; i++) { cin>>a[i]; } sort(a,a+n); if(x<n) { sum+=x*a[n-x-1]; for(int i=n-x; i<n; i++) { sum+=a[i]-a[n-x-1]; } } else{ for(int i=0;i<n;i++){ sum+=a[i]; } } cout<<sum<<endl; return 0; }
b.点击消除
题意:给定一个字符串如果两个相邻的字符相同可以消除,然后把2个字符删除,把后面的接上来继续判断。
题解:如果想到用stl模板的话就很简单。就是一直循环判断,直到没有东西可以消除时,结束循环,消除用erase(i,2)就是消除这个字符和它后面的字符,然后接着判断。
代码:
#include<iostream> #include<string> using namespace std; int main() { int flag=1; string a; cin>>a; while(flag!=0) { flag=0; /*if(a.size()==2&&a[0]==a[1]){ cout<<0<<endl; return 0; }*/ for(int i=0; i<a.size(); i++) { if(a[i]==a[i+1]) { a.erase(i,2); flag=1; } } if(flag==0) { break; } } if(a.size()==0){ cout<<0<<endl; return 0; } cout<<a<<endl; return 0; }
f.疯狂的自我检索者
题意:有n个人为她打分,但是只知道m个人的分数,问平均分最大和最小是多少。
题解:n-m个人的分数给定一个范围了,最大就是5*(n-m),最小就是1*(n-m)然后把其他知道的分数加起来除以n就是平均分了
代码:
#include<bits/stdc++.h> using namespace std; int main(){ int n,m,k; double x; double sum1,sum2,sum=0; cin>>n>>m; if(n==m){ sum1=1; sum2=5; printf("%.5f %.5f ",sum1,sum2); } else{ k=n-m; while(k--){ cin>>x; sum+=x; } printf("%.5f %.5f ",(sum+m)/n,(sum+5*m)/n); } return 0; }
h.神奇的字母(2)
题意:输入一堆字符串可以n行,判断哪个字符串最多
题解:我是一个一个字符输出的a=getchar()当连续输出2个换行就结束,判断哪个最多用数组和排序就可以了(写得比较麻烦- -)
代码:
#include<bits/stdc++.h> using namespace std; struct xx{ int m; int n; }k[10001]; bool cmp(xx p,xx q){ return p.m>q.m; } int main() { char a,b; int t=1; a=getchar(); k[a-96].m++; k[a-96].n=a-96; b=a; while(t<=1000){ a=getchar(); if(a<='z'&&a>='a'){ k[a-96].m++; k[a-96].n=a-96; } if(b==' '&&a==' '){ break; } b=a; t++; } sort(k,k+t,cmp); cout<<char(k[0].n+96)<<endl; return 0; }
i.十字爆破
题意:给定一个n*m表格计算每个数字所占行和列的大小
题解:设2个数组一个存x轴一个存y轴,然后遍历把ax[i]+ay[i]-本身就是值了
代码:
#include<stdio.h> #define ll long long ll n,m; ll a[1000001]; ll sumx[3000001]; ll sumy[3000001]; int main(){ scanf("%d %d",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%lld",&a[i*m+j]); sumx[i]+=a[i*m+j]; sumy[j]+=a[i*m+j]; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(j==m-1){ printf("%lld ",sumx[i]+sumy[j]-a[i*m+j]); } else{ printf("%lld ",sumx[i]+sumy[j]-a[i*m+j]); } } } }