题意:给定n个钉子,钉子的高度为x,所连的线为y,所有钉子都连着一个糖果,问需要减几个绳子糖果可以落地
思路:只需判断绳子的长度小于钉子的长度的钉子有几个
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
set<int >st;
void solve () {
int n;
cin>>n;
int cnt=0 ;
while (n--){
int l,r;
cin>>l>>r;
if (l-r>0 )cnt++;
}
cout<<cnt<<endl;
}
signed main () {
int t;
cin>>t;
while (t--){
solve ();
}
}
题意:五子棋的弱化版(五变成三),问谁赢了
思路:暴力判断
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
#define endl '\n'
void solve () {
string s[3 ];
for (int i=0 ;i<3 ;i++)cin>>s[i];
if (s[0 ][0 ]!='.' &&s[0 ][0 ]==s[1 ][1 ]&&s[0 ][0 ]==s[2 ][2 ]){
cout<<s[0 ][0 ]<<endl;
return ;
}
if (s[0 ][2 ]!='.' &&s[0 ][2 ]==s[1 ][1 ]&&s[0 ][2 ]==s[2 ][0 ]){
cout<<s[0 ][2 ]<<endl;
return ;
}
for (int i = 0 ; i <3 ; ++i) {
if (s[i][0 ]!='.' &&s[i][0 ]==s[i][1 ]&&s[i][0 ]==s[i][2 ]){
cout<<s[i][0 ]<<endl;
return ;
}
if (s[0 ][i]!='.' &&s[0 ][i]==s[1 ][i]&&s[0 ][i]==s[2 ][i]){
cout<<s[0 ][i]<<endl;
return ;
}
}
cout<<"DRAW\n" ;
}
int main () {
int t;
ios::sync_with_stdio (false ),cin.tie (0 ),cout.tie (0 );
cin>>t;
while (t--){
solve ();
}
}
题意:ACM赛制n个人,m道题,每道题的解决时间为a[i],问一号选手的排名是多少(相同1号则靠前)
思路:将解决时间排序,然后算出解决问题的总时间与总个数(前缀,个数则是解决一个问题,时间减少-1e9),加入pair,求得答案
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
bool cmp (pair<int ,int >x,pair<int ,int >y) {
if (x.second!=y.second)
return x.second<y.second;
return x.first<y.first;
}
void solve () {
int n,m,h;
cin>>n>>m>>h;
vector<pair<int ,int >>q;
for (int i = 0 ; i <n ; ++i) {
vector<int >g (m);
for (int j = 0 ; j <m ; ++j) {
cin>>g[j];
}
sort (g.begin (),g.end ());
for (int j = 1 ; j <g.size () ; ++j) {
g[j]+=g[j-1 ];
}
int s=0 ;
int p=0 ;
for (int j = 0 ; j <g.size () ; ++j) {
int gg;
if (j==0 )gg=g[j];
else
gg=g[j]-g[j-1 ];
if (gg+p<=h){
s-=1e9 ;
s+=g[j];
p+=gg;
}
else break ;
}
q.push_back ({i,s});
}
sort (q.begin (),q.end (),cmp);
for (int i = 0 ; i <n ; ++i) {
if (q[i].first==0 ){
cout<<i+1 <<endl;
return ;
}
}
}
signed main () {
int t;
cin>>t;
while (t--){
solve ();
}
}
题意:给n个底边和高一样的三角形,他们的底边的高度不同,问组成集合的面积是多少
思路:排序后,从低向高遍历相似求面积
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve () {
int d,h,n;
cin>>n>>d>>h;
double s=0 ;
vector<int >q (n);
for (int i = 0 ; i <n ; ++i) {
cin>>q[i];
}
sort (q.begin (),q.end ());
int r=0 ;
for (int i = 0 ; i <n ; ++i) {
if (q[i]>=r){
s+=d*h*0.5 ;
r=q[i]+h;
}
else {
s+=d*h*0.5 ;
s-=(r-q[i])*1.0 *(r-q[i]*1.0 )/h*d*0.5 ;
r=q[i]+h;
}
}
printf ("%.7f\n" ,s);
}
signed main () {
int t;
cin>>t;
while (t--){
solve ();
}
}
题意:雪花问题,给n个顶点,问能否组成雪花,雪花的问题是问这个n是不是,1+x^2+x^3+x^4……(x∈正整数),雪花至少有2层。
思路:easy-version之中n的数据范围很小,1e6,直接暴力求解一下1到1e6之中哪些数被标记。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
bool vis[1000006 ];
void solve () {
int n;
cin>>n;
if (vis[n]){
cout<<"YES\n" ;
}
else {
cout<<"NO\n" ;
}
}
signed main () {
for (int i=2 ;i<=1000000 ;i++){
int s=1 ,last=1 ;
for (int j = 1 ; ; ++j) {
last*=i;
s+=last;
if (s>1000000 )break ;
if (j>1 )
vis[s]= true ;
}
}
int t;
cin>>t;
while (t--){
solve ();
}
}
题意:E2为hard版本的,n的数据范围1e18
思路:我们可以知道如果雪花大于等于三层的话,这个x的范围为2到1e6,然后我们二分1e18,即可标记出哪些成立,加入set,如果不成立,然后我们再特判一下两层雪花的情况,二分一下1e6到1e18的数是否满足这个n
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
set<int >st;
void solve () {
int n;
cin>>n;
if (st.count (n)){
cout<<"YES\n" ;
return ;
}
__int128 l=1000000 ,r=1e9 ;
while (l<r){
__int128 mid=l+r>>1 ;
if ((mid*mid*mid-1 )/(mid-1 )>=n)r=mid;
else
l=mid+1 ;
}
if ((l*l*l-1 )/(l-1 )==n)cout<<"YES\n" ;
else
cout<<"NO\n" ;
}
signed main () {
for (int i=2 ;i<=1000000 ;i++){
__int128 s=1 +i+i*i,last=i*i;
st.insert (s);
for (int j = 1 ;; ++j) {
last*=i;
s+=last;
if (s>=(int )1e18 )break ;
st.insert (s);
}
}
int t;
cin>>t;
while (t--){
solve ();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】