F.CodeForces - 1118D1html
題意:有n杯咖啡,須要寫m頁做業;他天天能夠喝 不限量 杯 咖啡(1或者多杯);每杯咖啡能夠讓他寫ai頁做業;在同一天裏,他所喝的咖啡能讓他寫w頁;ios
w=(第一杯+第二杯-1+第三杯-2……);求最少喝幾天能寫完做業(這題意好像描述的不是不少,湊合~語文很差)c++
解:排序+二分答案,下限1天,上限n天,check的話直接看碼;數組
O(nlogn)ide
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; int a[MAXN]; int n,m; bool check(int mid){ int ans=0; int i=1; int cnt=0; int k=mid; while(i<=n){ for(;i<=min(k,n);i++){ ans+=max(a[i]-cnt,0); } if(ans>=m)return true; k=k+=mid; cnt++; } return false; } bool cmp(int x,int y){ return x>y; } int main(){ ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+1+n,cmp); int ans=-1; int l=1,r=n,mid; while(l<=r){ mid=(l+r)>>1; if(check(mid)){ r=mid-1; ans=mid; } else l=mid+1; } cout<<ans<<endl; return 0; }
E.CodeForces - 1221Cpost
題意:acm組隊,有a個代碼手,b個數論king,c個閒人;spa
求最多能組多少隊,每隊至少要有1個代碼手和一個數論king;.net
解:模擬?;easycode
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; typedef long long ll; int main(){ ios::sync_with_stdio(false); int T; cin>>T; while(T--){ ll a,b,c,minn; cin>>a>>b>>c; minn=min(a,min(b,c)); if(minn!=c){ cout<<minn<<endl; } else{ a-=c;b-=c; cout<<minn+min(a,min(b,(a+b)/3))<<endl; } } return 0; }
D.CodeForces - 1221Bhtm
題意:給一個n,輸出一個圖(只含有W,B),使得每一個W或B能攻擊B或W的個數最多;
每一個只能攻擊日字對角線上的;W攻擊B,B攻擊W;
解:交叉輸出BW就好了;
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=2e5+10; int main(){ ios::sync_with_stdio(false); int n; cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i%2==j%2)cout<<'B'; else cout<<'W'; } cout<<endl; } return 0; }
題意:n個數,求去掉一個數,使得剩下數組中奇數項和 等於 偶數項和 的個數;
解:先求出不去掉的奇數項和 和 偶數項和;
而後遍歷數組;i表明去掉第i個數 而後
奇數項和=(i以前的奇數項和+i以後的偶數項和)
偶數項和=(i以前的偶數項和+i以後的奇數項和)
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=2e5+10; int a[MAXN]; int main(){ ios::sync_with_stdio(false); int n; cin>>n; int sum1=0; int sum2=0; for(int i=1;i<=n;i++){ cin>>a[i]; if(i%2)sum1+=a[i]; else sum2+=a[i]; } //cout<<"sum1="<<sum1<<' '<<"sum2="<<sum2<<endl; int ans=0; int newsum1=0; int newsum2=0; for(int i=1;i<=n;i++){ if(i%2){ sum1-=a[i]; if(sum1+newsum2==sum2+newsum1)ans++; newsum1+=a[i]; } else { sum2-=a[i]; if(sum1+newsum2==sum2+newsum1)ans++; newsum2+=a[i]; } } cout<<ans<<endl; return 0; }
題意:給你n個數,每兩個同樣的數能夠合併成這個數的兩倍,問可否合成2048;
2048遊戲~;
解:桶排序;把小於等於2048的數進行桶排序,大於2048就不可能合成了;
而後從1開始遍歷到2048(1024便可),num[i]>=2?num[i*2]+=num[i]/2:continue;
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e3+10; int a[MAXN]; int num[3000]; int main(){ ios::sync_with_stdio(false); int T,n; cin>>T; while(T--){ cin>>n; memset(num,0,sizeof(num)); for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]<=2048){ num[a[i]]++; } } for(int i=1;i<=2048;i++){ if(num[i]>=2){ num[i*2]+=num[i]/2; } } if(num[2048])cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
題意:兩種水瓶,1L a元,2L b元,問須要n L水最少須要花費多少;
解:直接比較1L和2L 的性價比,而後照着買;
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,a,b; int main(){ ios::sync_with_stdio(false); int T; cin>>T; while(T--){ cin>>n>>a>>b; if(a*2<=b){ cout<<n*a<<endl; } else{ ll ans=0; ans+=n/2*b; if(n%2){ ans+=a; } cout<<ans<<endl; } } return 0; }