A:
http://codeforces.com/contest/990/problem/A
让 n 是 m 的整数倍, 的最小 花费 是多少
#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 1e5+10;
using namespace std;
int main()
{
ll n,m,a,b;
cin>>n>>m>>a>>b;
if(n%m==0)
{
cout<<0<<endl;
}
else
{
cout<<min(a*(m-n%m),b*(n%m))<<endl;
}
return 0;
}
B
大鱼吃小鱼,
问最后剩下几只大鱼
标记所有没有被吃掉的鱼,最后加上个数
http://codeforces.com/contest/990/problem/B
#include<bits/stdc++.h>
typedef long long ll;
const int MAXN = 2e5+ 10;
using namespace std;
ll a[MAXN],b[MAXN];
map<ll,int>mp;
int cmp(int a,int b)
{
return a>b;
}
int vis[MAXN];
int main()
{
ll n,k;
cin>>n>>k;
for(int i = 1 ;i<=n;i++)
{
cin>>a[i];
b[i]= a[i];
mp[a[i]]++;
}
sort(a+1,a+n+1);
int len = unique(a+1,a+1+n)-(a+1);
if(len==1)
{
cout<<n<<endl;
return 0;
}
// cout<<a[len]<<" "<<mp[a[len]]<<endl;
ll ans = mp[a[len]];
for(int i = 1; i<=len;i++)
{
if( a[i] < a[i+1] && a[i]+k < a[i+1])
{
vis[i] = 1;
}
}
for(int i= 1;i<=n;i++)
{
if(vis[i])
ans+=mp[a[i]];
}
cout<<ans<<endl;
return 0;
}
C:
http://codeforces.com/contest/990/problem/C
左括号匹配右括号, 或者一个完整的括号区匹配完整的括号 , 问有多少种
先预处理所有的括号, "(" ++ , ") "--; 小于0 不考虑
>=0 起来,
然后 将字符串逆转后 所有的括号 取反 "("->")" ,")" -> "(";
在处理 所有的括号,
最后取结果.
#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 3e5 +10;
#define fastIO ios_base::sync_with_stdio(0);
using namespace std;
int n;
string str[MAXN+10];
ll b[3][MAXN+10];
void init(int x)
{
for(int i = 1;i<=n;i++)
{
int len =str[i].size();
int c = 0;
int flag = 1;
for(int j = 0 ; j<len ;j++)
{
if(str[i][j]=='(') c++;
else
c--;
if(c<0)
{
flag =0 ;
break;
}
}
if(flag)
{
b[x][c] ++;
}
}
}
int main()
{
cin>>n;
memset(b,0,sizeof(b));
for(int i = 1 ;i <=n ;i++)
{
cin>>str[i];
}
init(1);
for(int i = 1 ;i <=n ;i++)
{
reverse(str[i].begin(),str[i].end());
}
ll ans = 0;
for(int i = 1; i<=n;i++)
{
int len = str[i].size();
for(int j = 0; j<len ;j++)
{
if(str[i][j]=='(')
str[i][j]=')';
else
str[i][j]='(';
}
}
init(0);
for(int i = 0 ;i< MAXN;i++)
ans += b[1][i]*b[0][i];
cout<<ans<<endl;
return 0;
}
D:
http://codeforces.com/contest/990/problem/D
图的构造
边长为 n 图的联通块 为a , 补图的联通块为 b.
a 和b 其中必有一个 1, 否则 NO
当 n ==2 或者 n ==3 时 a =1 ,b= 1 为 NO
其余为YES
#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 3e5 +10;
#define fastIO ios_base::sync_with_stdio(0);
using namespace std;
int mp[1200][1200];
int main()
{
int n,a,b;
cin>>n>>a>>b;
if(a != 1 && b!= 1)
{
cout<<"NO"<<endl;
return 0;
}
if( (n==2|| n==3)&&(a==1&&b==1) )
{
cout<<"NO"<<endl;
return 0;
}
memset(mp,0,sizeof(mp));
cout<<"YES"<<endl;
if( a==1 && b==1 )
{
for(int i = 1; i <=n-1;i++)
mp[i][i+1] = mp[i+1][i] = 1;
}
else
{
int x = max(a,b);
for(int i= 1 ;i <= (n-x);i++)
{
mp[i][i+1]= mp[i+1][i] = 1;
}
if(b==x)
{
for(int i = 1; i <=n;i++)
{
for(int j = 1; j<=n;j++)
{
if(i==j) continue;
if( mp[i][j] ==1)
mp[i][j] = 0;
else
mp[i][j] =1;
}
}
}
}
for(int i = 1; i<=n;i++)
{
for(int j = 1; j <= n; j++)
{
cout<<mp[i][j];
}
cout<<endl;
}
return 0;
}
1