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;
}
总结
难度较难,需耐心些找到规律,进行相加