题意:给定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();
}
}