eg:感觉题目很简单,但是下午有课,打了俩小时多就去上课了,最后七题结尾。
比赛传送门
A-Find the twins
题意:找出十个数里是否有17和18
题解:签到
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
int a[11];
int main(){
int T;
scanf("%d",&T);
while(T--){
int zack=0,mack=0;
for(int i=1;i<=10;i++){
scanf("%d",&a[i]);
if(a[i]==17)zack=1;
if(a[i]==18)mack=1;
}
for(int i=1;i<10;i++)printf("%d ",a[i]);
printf("%d\n",a[10]);
if(zack && mack)puts("both");
else if(zack)puts("zack");
else if(mack)puts("mack");
else puts("none");
printf("\n");
}
return 0;
}
B-Medal Ranking
题意:给出两个国家的金牌,银牌,铜牌数量。有两种排序方法,第一种是奖牌的总数,第二种是每个牌的数量按照优先级比较。
看A国家是否都能赢B国家。
题解:签到题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
struct arr{
int sum,no,g,s,m;
}a[3];
int main(){
int T;
scanf("%d",&T);
while(T--){
int count=0,color=0;
for(int i=1;i<=2;i++){
scanf("%d%d%d",&a[i].g,&a[i].s,&a[i].m);
a[i].sum=a[i].g+a[i].s+a[i].m;a[i].no=i;
}
printf("%d %d %d %d %d %d\n",a[1].g,a[1].s,a[1].m,a[2].g,a[2].s,a[2].m);
if(a[1].sum>a[2].sum)count=1;
if(a[1].g>a[2].g)color=1;
else if(a[1].g==a[2].g){
if(a[1].s>a[2].s)color=1;
else if(a[1].s==a[2].s){
if(a[1].m>a[2].m)color=1;
}
}
if(count && color)puts("both");
else if(count)puts("count");
else if(color)puts("color");
else puts("none");
puts("");
}
return 0;
}
C-Brownies vs. Candies vs. Cookies
题意:给出n组人和m个饼干,若m个饼干小于等于当前的人,那么m可以翻倍。
题解:模拟即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
int n,m,k,x;
int main(){
int T;
scanf("%d",&T);
for(int ttt=1;ttt<=T;ttt++){
scanf("%d%d",&n,&m);
printf("Practice #%d: %d %d\n",ttt,n,m);
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d",&x);
if(m>x)printf("%d %d\n",x,m-x),m-=x;
else {
while(m<=x)m*=2;
printf("%d %d\n",x,m-x),m-=x;
}
}
puts("");
}
return 0;
}
D-Lemonade Stand
题意:做一杯奶茶需要x个柠檬和y份糖,经营n天,每天需要做ai份奶茶,当天一个柠檬的价格是bi,80份糖的价格是ci,只能80份80份的买糖。
题解:贪心,如果在第i天柠檬不够了,那么一直买到第j天的需要,保证bj<bi。糖同理,但是糖复杂一点判断一下即可。
#include<bits/stdc++.h>
using namespace std;
struct day{
int num;
int pl;
int ps;
}a[1005];
priority_queue<int, vector<int>, greater<int> >q1,q2;
int main(){
int k,n,t,su=0,ple,psu,pl,ps;
cin>>n;
while(n--){
while(!q1.empty())q1.pop();
while(!q2.empty())q2.pop();
su=0;
cin>>k>>ple>>psu;
long long ans=0;
for(int i=0;i<k;i++){
scanf("%d%d%d",&a[i].num,&a[i].pl,&a[i].ps);
}
for(int i=0;i<k;i++){
q1.push(a[i].pl);
ans=ans+q1.top()*a[i].num*ple;
}
for(int i=0;i<k;i++){
q2.push(a[i].ps);
if(a[i].num*psu>su){
int ff;
if((a[i].num*psu-su)%80==0)ff=(a[i].num*psu-su)/80;else ff=(a[i].num*psu-su)/80+1;
ans=ans+q2.top()*ff;
su=ff*80-(a[i].num*psu-su);
}
else su=su-a[i].num*psu;
}
cout<<ans<<endl;
}
return 0;
}
E-Rain Gauge
题意:算出同心的圆和正方形的面积交
题解:几何题,三种情况分类讨论即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double mPI=3.14159265358979;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
double s,r;
double solve(){
if(2*r*r>=s*s)return s*s;
if(s>=2*r)return mPI*r*r;
double d=s/2;
double s1=sqrt(r*r-d*d)*d;
double s2=r*r/2*(mPI/2-2*acos(d/r));
return (s1+s2)*4;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%lf%lf",&s,&r);
printf("%.2lf\n",solve());
}
return 0;
}
F-Balanced Strings
题意:给出平衡字符串的定义:任意偶数长度的连续子串的元音字母和辅音字母个数相同。现在各出一个只含小写字母和?的字符串,?可以安排任意字母,问有多少种方法使得其为一个平衡字符串。
题解:统一考虑整个字符串,假设第一个为元音,那么第一个?就有20种,之后类推。假设第一个为辅音,那么第一个?为元音,之后类推。最后答案为两种之和。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
char s[maxn];
int main(){
int T,ttt=0;
scanf("%d",&T);
while(T--){
ttt++;
ll ans=0;
scanf("%s",&s);
int len=strlen(s);
for(int j=0;j<2;j++){
ll sum=1;
for(int i=0;i<len;i++){
int flag=0;
if(s[i]=='a' || s[i]=='e' || s[i]=='i' || s[i]=='o' || s[i]=='u' || s[i]=='y')flag=1;
if((i+j)%2){
if(s[i]=='?')sum*=20;
else if(flag)sum=0;
}else {
if(s[i]=='?')sum*=6;
else if(!flag)sum=0;
}
}
ans+=sum;
}
printf("String #%d: %lld\n",ttt,ans);
puts("");
}
return 0;
}
G-Towers of Hanoi Grid
题意:二维汉诺塔,问最少步数。
题解:一个盘子的最少步数为
,n个盘子就是
,不成立的情况就是
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
ll read(){
ll f=1,x=0;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
return f*x;
}
int n,m;
int main(){
int T,ttt=0;
scanf("%d",&T);
while(T--){
ttt++;
scanf("%d%d",&n,&m);
printf("Grid #%d: ",ttt);
if(n>(m-1)*(m-1)+1)puts("impossible");
else{
printf("%d\n",n*2*(m-1));
}
puts("");
}
return 0;
}