传送门:http://codeforces.com/contest/670
A. Holidays
题意:一个星球 五天工作,两天休息。给你一个1e6的数字n,问你最少和最多休息几天。
思路:最少休息的天数肯定是刚刚休息好工作的节奏。只需判断n % 7 的余数如果小于等于5就是n/7,否则就是 n/7 + 1;
最多的休息天数是先休息两天,在按照上面的思路做就行。
#include<bits/stdc++.h>
using namespace std;
int main ()
{
//yyy_3y
int n; cin >> n;
int tmp = n/7;
if (n == 1) cout << 0 << " " << 1 <<endl;
else {
if (n % 7 <= 5) cout << tmp*2 << " ";
else cout << tmp*2+1<< " ";
n = n-2;
tmp = n/7;
if (n % 7 <= 5) cout << tmp*2+2;
else cout << tmp*2+1+2;
}
return 0;
}
B. Game of Robots
题意:第一个机器人报自己的编号;第二个报前一个机器人和自己的编号;第三个机器人报前两个机器人和自己的编号。以此类推。
每个机器人一个编号。问k个报什么。
思路:看下n的范围,手动遍历毫无压力。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[110000];
int main ()
{
//yyy_3y
int n,k;
scanf("%d%d",&n,&k);
for(int j=1;j<=n;j++)
scanf("%d",&a[j]);
for(int i=1;i<=n;i++) {
if(k>i) k=k-i;
else return 0*printf("%d\n",a[k]);
}
}
C. Cinema
题意:有n个人,每个人只会一种语言(不同编号表不同语言)。
现在有m部电影,每部电影的声音是a[i],字幕是b[i]。(a[i]输入完输入b[i])
如果听得懂声音,他会非常满意,如果字幕他能看懂的话他会比较满意,否则它很不满意。
现在问看哪部电影会使得n个人满意最高(如果两部电影使n个人非常满意的人数相同时,选比较满意的最多的)。
思路:a[i]非常的大,一开始想离散化求解。想想可以map存方便些。
O(n)找到非常满意的,O(n)比较下非常满意总比较满意的数量。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<int,int> mp;
int a[210000];
struct Node
{
int x,y;
}p[210000];
int main ()
{
//yyy_3y
int n; cin >> n;
for (int i = 1; i <= n; i++) {
cin >>a[i];
mp[a[i]] ++;
}
int m; cin >>m;
for (int i = 1; i <= m; i++) cin >>p[i].x;
for (int i = 1; i <= m; i++) cin >>p[i].y;
int cc = 0, index = 1;
for (int i = 1; i<= m; i++){
if (cc < mp[p[i].x]){
cc = mp[p[i].x];
index = i;
}
}
int pp = 0;
for (int i = 1; i<= m; i++){
if (cc == mp[p[i].x]){
if (pp < mp[p[i].y]){
pp =mp[p[i].y];
index = i;
}
}
}
cout << index <<endl;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<map>
#include<cstdlib>
using namespace std;
typedef double db;
typedef long long ll;
const int MAXN = 200005;
map<int,int> mp;
int b[MAXN],c[MAXN];
int main ()
{
int n; scanf("%d",&n);
for(int i=1;i<=n;i++){
int a; scanf("%d",&a);
mp[a]++;
}
int m; scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
for(int i=1;i<=m;i++) scanf("%d",&c[i]);
int lo = 1;
for (int i=1;i<=m;i++){
if(mp[b[i]] > mp[b[lo]] || (mp[b[i]] == mp[b[lo]] && mp[c[i]] > mp[c[lo]])) lo = i;
}
printf("%d\n",lo);
return 0;
}
赛中和赛后的学习,思路更加清晰,时间快了3倍。
D. Magic Powder
题意:做一个蛋糕需要n个原材料,现有k个魔法材料,魔法材料可以替代成任何材料,现在告诉你蛋糕每个材料需要多少,以及你现在有多少个,问你最多能够做出多少个蛋糕来。
思路:二分枚举。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll a[110000],b[110000];
const ll maxn = 1e9 * 3;
ll n,k;
ll solve (ll l,ll r)
{
while (l <= r){
ll sum =0;
ll mid = (l+r) /2;
// printf("%lld\n",mid);
for(ll i = 1; i <= n ;i++){
if (a[i]*mid - b[i] > 0) sum += a[i]*mid - b[i];
// printf("sum = %lld\n",a[i]*mid - b[i]);
if (sum > k) break;
}
if (sum == k) return mid;
else if (sum < k) l = mid +1;
else r = mid -1;
}
return r;
}
int main ()
{
//yyy_3y
scanf("%lld %lld",&n,&k);
for(int i = 1; i <= n; i++) scanf("%lld",&a[i]);
for(int i = 1; i <= n; i++) scanf("%lld",&b[i]);
printf("%lld\n",solve(1,maxn));
}
比赛写的代码真的不咋漂亮,简单写法。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<map>
#include<cstdlib>
using namespace std;
typedef double db;
typedef long long ll;
const int MAXN = 100005;
ll b[MAXN],a[MAXN];
int main ()
{
int n,k; scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
for(int i=1;i<=n;i++) scanf("%I64d",&b[i]);
ll l=0,r=2e9+10;
while (l<r){
ll m=(l+r+1)/2,tot=0;
for(int i=1;i<=n && tot<=k;i++)
tot+=max(0LL,a[i]*m-b[i]);
if(tot>k) r=m-1;
else l=m;
}
printf("%I64d",l);
return 0;
}
E. *Correct Bracket Sequence Editor
题意:给你长度5e5的括号字符,m个操作,光标初始位置是p.
‘L’操作表示左移光标,’R’操作表示右移光标’D’操作表示删除当前光标所在的字符对应的括号字符以内的所有字符。删除操作后光标右移,如果右边没有,那么到尾上,问做完所有操作以后输出什么。
思路:链表。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<map>
#include<cstdlib>
#include<stack>
#include<list>
using namespace std;
typedef double db;
typedef long long ll;
const int MAXN = 500005;
char s[MAXN], op[MAXN];
stack<int> skt;
list<int>lk;
typedef list<int>::iterator ptr;
int sv[MAXN];
int main ()
{
freopen("1.in","r",stdin);
int n,m,p;
scanf("%d%d%d%s%s",&n,&m,&p,s+1,op+1);
for (int i=1;i<=n;i++){
if(s[i]=='(') skt.push(i);
else {
sv[i]=skt.top();
sv[skt.top()]=i;
skt.pop();
}
}
for(int i=1;i<=n;i++) lk.push_back(i);
ptr r = lk.begin();
for(int i=1;i<p;i++) r++;
for(int i=1;i<=m;i++){
if (op[i]=='R') r++;
else if(op[i]=='L') r--;
else {
ptr l=r;
if(sv[*r]<*r) while (sv[*r]!=*l) l--;
else while (sv[*l]!=*r) r++;
while (l!=r) lk.erase(l++);
lk.erase(r++);
if (r == lk.end()) r--;
}
}
// printf(" 1");
for (ptr lo=lk.begin();lo!=lk.end();lo++)
printf("%c",s[*lo]);
return 0;
}