Problem A Collecting Beats is Fun
题意:就是音乐游戏在4*4的网上一些格子需要在固定的时间点,告诉你一只手同一时间能点几个。问你能不能通关(就是一个不丢)
思路:水题 。我开了一个数组统计一下每个时间出现的格子数。最后扫一遍判断有没有不能点完的就OK了
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <utility> 7 #include <queue> 8 #include <vector> 9 #include <stack> 10 #define INF 0x7fffffff 11 #define ll long long 12 #define eps 1E-6 13 14 using namespace std; 15 16 int main() 17 { 18 // freopen("in.txt", "r", stdin); 19 int n, cnt[11]; 20 while(scanf("%d", &n)!=EOF){ 21 memset(cnt, 0, sizeof cnt); 22 for(int i=0; i<4; i++){ 23 for(int j=0; j<4; j++){ 24 char temp; 25 cin >> temp; 26 if(temp!='.') cnt[temp-'0']++; 27 } 28 } 29 int ans = 1; 30 for(int i=0; i<10; i++){ 31 if(cnt[i]>2*n)ans = 0; 32 } 33 if(ans) cout << "YES" << endl; 34 else cout << "NO" << endl; 35 } 36 return 0; 37 }
Problem B Making Sequences is Fun
题意:给你一个m你要找(m,m+1,。。。)这个数列。每往这个数列中加入一个数花费是S(x)*k,S(x)表示数字的位数,问你最长能加多少个数?
思路:我用的方法很暴力,首先看m为几位数假设为a位,那么看看把a位中比m大的全部加进来,若不行那直接算出来多少个数。若可以加则从a+1开始枚举,直到剩下来的费用已经不能把b位的数全加进来了。这是在算一下b位的书能加几个就OK了。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <utility> 8 #include <queue> 9 #include <vector> 10 #include <stack> 11 #define INF 0x7fffffff 12 #define ll long long 13 #define eps 1E-6 14 15 using namespace std; 16 17 ll w, m ,k, ans, cost[30]; 18 19 ll Pow(ll a, ll b){ 20 ll ret = 1; 21 while(b--){ 22 ret*=a; 23 } 24 return ret; 25 } 26 27 int main() 28 { 29 // freopen("in.txt", "r", stdin); 30 31 memset(cost, 0, sizeof cost); 32 for(ll i=1; i<21; i++){ 33 cost[i] = Pow(10, i); 34 for(int j=1; j<i; j++){ 35 cost[i]-=cost[j]; 36 } 37 } 38 while(cin >> w >> m >> k){ 39 ll mon = w/k; 40 ll ii; 41 for(ii=1; ii<20; ii++){ 42 if(Pow(10, ii)>m)break; 43 } 44 ll cc = (Pow(10, ii)-m)*ii, ans = 0; 45 if(mon<=cc) ans = mon/ii; 46 else{ 47 mon-=cc; 48 ans+=Pow(10, ii)-m; 49 while(mon>0){ 50 ++ii; 51 if(cost[ii]*ii<=mon){ 52 mon-=cost[ii]*ii; 53 ans+=cost[ii]; 54 }else break; 55 } 56 ans+=mon/ii; 57 } 58 cout << ans << endl; 59 } 60 return 0; 61 }
Problem C Counting Kangaroos is Fun
题意:一个袋鼠可以装下另一个袋鼠当且仅当他的体重是另外一个的两倍。在袋鼠口袋里有东西的时候就不能再装别的东西或者被别的袋鼠装了,一个袋鼠被装了以后就看不见了。问你最少会看见多少只袋鼠?
思路:二分答案。每一次判断答案是否可行就是看前mid个是否能被后mid个装下(排序好的)。前两天在刷uva今天补上这一题。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 #include <vector> 7 #include <stack> 8 #define LEN 1000100 9 #define INF 0x7fffffff 10 #define eps 1e-6 11 #define ll long long 12 13 using namespace std; 14 15 int a[LEN], n; 16 17 void debug() 18 { 19 for(int i=0; i<n; i++){ 20 cout << a[i] << ' '; 21 }cout << endl; 22 } 23 24 bool check(int pos){ 25 for(int i=0; i<pos; i++){ 26 if((2*a[i])>a[n-pos+i])return false; 27 } 28 return true; 29 } 30 31 int main() 32 { 33 freopen("in.txt", "r", stdin); 34 35 while(scanf("%d" ,&n)!=EOF){ 36 for(int i=0; i<n; i++){ 37 scanf("%d", &a[i]); 38 } 39 sort(a, a+n); 40 int l = 0, r = n/2; 41 while(l<r){ 42 int mid = (l+r+1)/2; 43 if(check(mid))l = mid; 44 else r = mid-1; 45 } 46 cout << n-l << endl; 47 } 48 return 0; 49 }