通师高专科技创新社在周赛 Round19

CF50A Domino piling

原题链接

题意

有一个n*n的矩形板让你用2*1的骨牌进行填充,问至少需要几块才能填充满。

思路

1. 根据图形 ,求出对应的面积

2.找出规律

坑点

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int m,n;
	cin>>m>>n;
	cout<<(m*n)/2;
	return 0;
} 

总结

难度简单

 CF45A Codecraft III

原题链接

题意

给你一个月份字符串让你求k个月后的月份

思路

1.根据月份规律和经过的k个月间隔求出每个月对应的月份

2.输出结果

坑点

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin>>s;//读入
    int y,x;
    if(s=="January")y=1;
    if(s=="February")y=2;
    if(s=="March")y=3;
    if(s=="April")y=4;
    if(s=="May")y=5;
    if(s=="June")y=6;
    if(s=="July")y=7;
    if(s=="August")y=8;
    if(s=="September")y=9;
    if(s=="October")y=10;
    if(s=="November")y=11;
    if(s=="December")y=12;
    
    cin>>x;
    x=x+y;
    x=x%12;
    if(x==1)cout<<"January";
    if(x==2)cout<<"February";
    if(x==3)cout<<"March";
    if(x==4)cout<<"April";
    if(x==5)cout<<"May";
    if(x==6)cout<<"June";
    if(x==7)cout<<"July";
    if(x==8)cout<<"August";
    if(x==9)cout<<"September";
    if(x==10)cout<<"October";
    if(x==11)cout<<"November";
    if(x==0)cout<<"December";
    return 0;
}

总结

难度简单

 CF1676E Eating Queries

原题链接

题意

有 n 颗糖,吃第 i 颗糖可以得到 ai​ 的糖分。

有q次询问,每次询问最少吃多少颗糖可以得到不小于 x的糖分,无解输出 -1

思路

1.首先需进行从大到小排序,先吃糖分高的

2.然后进行k次的询问二分,若所求恰好等于x,输出糖果数,不能满足则输出-1

坑点

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=150010;
int n,m;
int f[N];
int t;
int a[N];
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		memset(a,0,sizeof a);
		int sum2=0;
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
			sum2+=a[i];
		}
		sort(a,a+n);
		reverse(a,a+n);
		for(int i=0;i<n;i++)//超时了,转化为前缀和,为O(1);二分查询为O(logn)
			a[i+1]+=a[i];
		while(m--)
		{
			int sum=0,x;
			cin>>x;
			int ans=lower_bound(a,a+n,x)-a;//二分求解
			if(ans==n)
			cout<<-1<<endl;
			else 
			cout<<ans+1<<endl;//下标从零开始,所有加1;
		}
		
	} 
	return 0;
 } 

总结

难度较难,需多思考

 CF144B Meeting

原题链接

题意

一张长方形桌子的四个顶点全部在整数点位置,桌子的四条边上每个整数点(x,y) (x,y都是整数)位置有一把椅子,代表有一个人,当使用加热器在桌子周围加热时,问有几个人不在加热范围之内。

思路

1.写一个函数确定点是否在范围内

2.然后再分别读入数据

3.如果点不在范围内进行数量相加

坑点

代码

#include <bits/stdc++.h>
using namespace std;
int n, ans, x[1005], y[1005], r[1005];
int f(int cx, int cy) 
{
    for(int i = 0; i < n; i++)
    {
    	if((x[i] - cx) * (x[i] - cx) + (y[i] - cy) * (y[i] - cy) <= r[i] * r[i])
		{
			return 0;
		}
	} 
    return 1;
}
int main() 
{
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2 >> n;
    for(int i = 0; i < n; i++)
    {
    	cin >> x[i] >> y[i] >> r[i];
	}
    for(int i = min(x1, x2); i <= max(x1, x2); i++)
    {
    	ans += f(i, y1) + f(i, y2);
	}
    for(int i = min(y1, y2) + 1; i < max(y1, y2); i++)
    {
    	  ans += f(x1, i) + f(x2, i);
	}
    cout << ans;
    return 0;
}

总结 

难度较难,需仔细想清楚数的范围

 CF231D Magic Box

原题链接

题意

给你一个立方体的边长,和对应面的值和当前所在的点,问在当前点能看到的值得和是多少

思路

1.画图进行观察,找到规律

2.然后根据规律,进行对应值的相加

3.输出结果

坑点

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int x, y, z, nx, ny, nz;
    cin>>x>>y>>z>>nx>>ny>>nz;
    int a[6];
    for(int i=0;i<6;i++)cin>>a[i];
    int ans=0;
    if(x<0)ans+=a[4];
    if(x>nx)ans+=a[5];
    if(y<0)ans+=a[0];
    if(y>ny)ans+=a[1];
    if(z<0)ans+=a[2];
    if(z>nz)ans+=a[3];
    cout<<ans;
    return 0;
}

总结

难度较难,需耐心些找到规律,进行相加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值