Codeforces Round #402 (Div. 2) (A-D)
2017-02-27 19:19
288 查看
CF #402 div2
A题:
数学。具体看代码吧。很容易明白的。
#include<bits/stdc++.h>
using namespace std;
int a[6],b[6];
int main()
{
int n, x, y;
cin>>n;
if(n==1){
cin>>x>>y;
if(x==y) printf("0\n");
else printf("-1\n");
return 0;
}
int count_a=0;
int count_b=0;
for(int i=0; i<n; i++){
cin>>x;
a[x]++;
}
for(int i=0; i<n; i++){
cin>>y;
b[y]++;
}
for(int i=1; i<=5; i++){
if((a[i]+b[i])%2==0){
if(a[i]>b[i]) count_a += (a[i]-b[i])/2;
else if(a[i]<b[i]) count_b += (b[i]-a[i])/2;
}
else{
return 0*printf("-1\n");
}
}
cout<<count_a<<endl;
return 0;
}
B题:
贪心。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
string s;
int k;
cin>>s>>k;
ll n=atoi(s.c_str());
if(n % ((ll)pow(10,k))==0)return 0*printf("0");
int count = 0;
for(int i= 0;i < s.length(); i++)
{
if(s[i]=='0')count++;
}
int ans=0;
if(count >= k)
{
int count_0 = 0;
for(int i = s.length()-1; i>=0;--i)
{
if(s[i]=='0'){
count_0++;
if(count_0 == k)
return 0*printf("%d\n",ans);
}
else ans++;
}
}
cout<<s.length()-1<<endl;
return 0;
}
C题:
贪心。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Price
{
int a,b,c;
}price[200010];
int cmp(const Price &a, const Price &b)
{
return a.c < b.c;
}
int main()
{
int n,k;
int ans=0;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>price[i].a;
}
for(int i=0;i<n;i++){
cin>>price[i].b;
}
for(int i=0;i<n;i++){
price[i].c = price[i].a - price[i].b;
}
sort(price,price+n,cmp);
for(int i = 0; i < k;i++){
ans += price[i].a;
}
for(int i = k; i < n; i++){
if(price[i].c < 0) ans += price[i].a;
else ans += price[i].b;
}
cout<<ans<<endl;
return 0;
}
D题:
二分。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200010];
string s,p;
int check(int n)
{
string tmp=s;
for (int i=0; i<n; i++)
{
tmp[a[i] - 1] = '*';
}
int i=0,j=0;
while (i < s.length() && j < p.length() )
{
if (tmp[i] != p[j]) i++;
else{
i++;
j++;
}
}
if(j==p.length())return 1;
else return 0;
}
int main()
{
cin>>s>>p;
for (int i = 0; i < s.length(); i++) cin>>a[i];
int l=0;
int r=s.length()-1;
int ans=0;
while (l<=r)
{
int mid = (l+r)>>1;
if (check(mid)){
ans = mid;
l = mid + 1;
}
else{
r = mid - 1;
}
}
cout<<ans<<endl;
return 0;
}
A题:
数学。具体看代码吧。很容易明白的。
#include<bits/stdc++.h>
using namespace std;
int a[6],b[6];
int main()
{
int n, x, y;
cin>>n;
if(n==1){
cin>>x>>y;
if(x==y) printf("0\n");
else printf("-1\n");
return 0;
}
int count_a=0;
int count_b=0;
for(int i=0; i<n; i++){
cin>>x;
a[x]++;
}
for(int i=0; i<n; i++){
cin>>y;
b[y]++;
}
for(int i=1; i<=5; i++){
if((a[i]+b[i])%2==0){
if(a[i]>b[i]) count_a += (a[i]-b[i])/2;
else if(a[i]<b[i]) count_b += (b[i]-a[i])/2;
}
else{
return 0*printf("-1\n");
}
}
cout<<count_a<<endl;
return 0;
}
B题:
贪心。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
string s;
int k;
cin>>s>>k;
ll n=atoi(s.c_str());
if(n % ((ll)pow(10,k))==0)return 0*printf("0");
int count = 0;
for(int i= 0;i < s.length(); i++)
{
if(s[i]=='0')count++;
}
int ans=0;
if(count >= k)
{
int count_0 = 0;
for(int i = s.length()-1; i>=0;--i)
{
if(s[i]=='0'){
count_0++;
if(count_0 == k)
return 0*printf("%d\n",ans);
}
else ans++;
}
}
cout<<s.length()-1<<endl;
return 0;
}
C题:
贪心。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Price
{
int a,b,c;
}price[200010];
int cmp(const Price &a, const Price &b)
{
return a.c < b.c;
}
int main()
{
int n,k;
int ans=0;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>price[i].a;
}
for(int i=0;i<n;i++){
cin>>price[i].b;
}
for(int i=0;i<n;i++){
price[i].c = price[i].a - price[i].b;
}
sort(price,price+n,cmp);
for(int i = 0; i < k;i++){
ans += price[i].a;
}
for(int i = k; i < n; i++){
if(price[i].c < 0) ans += price[i].a;
else ans += price[i].b;
}
cout<<ans<<endl;
return 0;
}
D题:
二分。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200010];
string s,p;
int check(int n)
{
string tmp=s;
for (int i=0; i<n; i++)
{
tmp[a[i] - 1] = '*';
}
int i=0,j=0;
while (i < s.length() && j < p.length() )
{
if (tmp[i] != p[j]) i++;
else{
i++;
j++;
}
}
if(j==p.length())return 1;
else return 0;
}
int main()
{
cin>>s>>p;
for (int i = 0; i < s.length(); i++) cin>>a[i];
int l=0;
int r=s.length()-1;
int ans=0;
while (l<=r)
{
int mid = (l+r)>>1;
if (check(mid)){
ans = mid;
l = mid + 1;
}
else{
r = mid - 1;
}
}
cout<<ans<<endl;
return 0;
}
相关文章推荐
- 使Div内内容可编辑
- 用CSS使2个DIV高度自适应
- div固定位置,不随滚动条滚动
- 一个简单的弹出div,div里是一个表格
- Codeforces Round #277.5 (Div. 2) B
- Codeforces Round #257 (Div. 2) 题解 SDUT2015暑假集训14级周赛3 C - 道
- div居中问题
- 单击生成div,定时器自动隐藏
- 【动态规划】Codeforces Round #406 (Div. 2) C.Berzerk
- 不定高度div 在一定高度div内水平垂直居中
- div+css布局入门[转]
- div两种滚动
- Codeforces Round #166 (Div. 2) D - Good Substrings
- Codeforces Round #232 (Div. 2)渣渣也写。
- Codeforces Round #277.5 (Div. 2) --E. Hiking (01分数规划)
- Codeforces Round #313 (Div. 2)-Currency System in Geraldion-水题
- 在固定大小div插入N个图片使其一行排列
- Codeforces Round #362 (Div. 2) B. Barnicle
- Codeforces Round #417 (Div. 2) A. Sagheer and Crossroads
- 2017-2018 ACM-ICPC Southeast Regional Contest (Div. 1) F.Move Away 几何