题目链接
http://codeforces.com/contest/1009
A. Game Shopping
直接模拟即可,用了一个队列来存储账单
#include <iostream> #include <algorithm> #include <queue> #include <stack> #define ll long long using namespace std; const int MAX = 1010; queue<int> bill; int c[MAX]; int main(){ int gameNum, billNum; cin >> gameNum >> billNum; int t; for(int i = 0; i < gameNum; i++) cin >> c[i]; for(int i = 0; i < billNum; i++){ cin >> t; bill.push(t); } int ans = 0; int x = bill.front(); for(int i = 0; i < gameNum; i++){ if(x >= c[i]){ ans++; bill.pop(); if(bill.empty()) break; x = bill.front(); } } cout << ans << endl; }
B. Minimum Ternary String
思维题
题意是10可以互换位置,12可以互换位置,求将输入序列转为最小字典序
可以发现,1是可以处于序列中任何位置的,因此我们记录1的数量,构造这样一个序列
在第一个2前插入所有1,这样能使的2全部往后靠到最后
注意不要忽略没有2的序列情况
#include <iostream> #include <cstdio> #include <algorithm> #define ll long long using namespace std; int const MAX = 100100; int main(){ int a[MAX]; char c; int len = 0; while((c = getchar()) != ' '){ a[len++] = c - '0'; } int oneNum = 0; for(int i = 0; i < len; i++){ if(a[i] == 1){ oneNum++; }//1可以放置于任意位置,先全部取出 } for(int i = 0; i < len; i++){ if(a[i] == 0){ cout << 0; } else if(a[i] == 2){ while(oneNum){ cout << 1; oneNum--; } cout << 2; } } while(oneNum){ cout << 1; oneNum--; } cout << endl; }
C. Annoying Present
通过特定变换使得数列平均值达到最大
只要稍微分类一下就可以计算出各种情况
应该考虑精度问题,使用cout应该设置精度
#include <iostream> #include <algorithm> #include <iomanip> #define ll long long using namespace std; const int MAX = 100100; ll sum(int n){ ll ans = 0; for(int i = 1; i <= n; i++){ ans+=i; } return ans; } int main(){ ll x, d; ll ans = 0, n, m; cin >> n >> m; ll t1 = sum(n-1); if(n%2 == 1){ ll t2 = sum((n-1)/2); for(int i = 0; i < m; i++){ cin >> x >> d; ans+=x*n; if(d >= 0){ ans+=d*t1; } else{ ans += 2*d*t2; } } } else{ ll t2 = sum(n/2-1); for(int i = 0; i < m; i++){ cin >> x >> d; ans+=x*n; if(d >= 0){ ans+=d*t1; } else{ ans += 2*d*t2+n*d/2; } } } cout.precision(10); cout << ans*1.0/n << endl; }