A. Commentary Boxes
#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define ll long long
const int maxn = 1e6+10;
const int mod = 2008;
const int N = 3010;
ll n,m,a,b;
int main(){
while(scanf("%lld%lld%lld%lld",&n,&m,&a,&b)!=EOF){
if(n % m == 0)
printf("0\n");
else{
ll x = n / m;
ll y = (n / m) + 1;
printf("%lld\n",min((y*m-n)*a,(n-m*x)*b));
}
}
return 0;
}
B. Micro-World
思路:用map标记一下出现的次数,在遍历的时候直接减下去。
#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define ll long long
const int maxn = 1e6+10;
const int mod = 2008;
const int N = 3010;
int n,k;
int a[maxn];
bool cmp(int a,int b){
return a > b;
}
int main(){
while(scanf("%d%d",&n,&k)!=EOF){
clr(a);
map<int,int>mp;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
mp[a[i]]++;
}
sort(a+1,a+n+1,cmp);
int pos = n;
for(int i=n-1;i>=1;i--){
if(a[i]>a[i+1]&&a[i]<=(a[i+1]+k)){
pos = pos - mp[a[i+1]];
}
}
printf("%d\n",pos);
}
return 0;
}
C. Bracket Sequences Concatenation Problem
思路:最开始用栈简化括号的时候搞错了。索性直接用数组模拟了。
把每个字符串全部简化为最简形式。只有四种情况,1、全是左括号,2、全是右括号,3、空串(完全匹配),4、既有左括号也有右括号(不符合要求)。然后根据规律累加即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define clr(a) memset(a,0,sizeof(a))
const int maxn = 1e6+10;
ll n;
struct node{
ll l,r;
}p[maxn];
ll num[2][maxn];
int main(){
while(scanf("%lld",&n)!=EOF){
clr(p);clr(num);
char s[maxn];
ll ans = 0;
for(int i=0;i<n;i++){
scanf("%s",s);
int len = strlen(s);
for(int j=0;j<len;j++){
if(s[j]==')'){
if(p[i].l) p[i].l --;
else p[i].r ++;
}
else p[i].l ++;
}
if(p[i].l&&p[i].r) continue;
if(p[i].l) num[0][p[i].l]++;
else if(p[i].r) num[1][p[i].r]++;
else ans ++;
}
ans *= ans;
for(int i=1;i<maxn;i++)
ans += num[0][i] * num[1][i];
cout<<ans<<endl;
}
return 0;
}
D. Graph And Its Complement
待补