A. Chess Tourney
题意:给定长度为2*n的数组,要求将其分为2组,使得a[i]>a[i+n] i∈[1,n]
思路:sort,判断中间两个数会不会相等。如果相等,不成立。反之,成立。
CODE:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[300];
int main(void)
{
int n;
cin >> n;
for(int i=1;i<=2*n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+2*n);
if(a[n]==a[n+1])
cout << "NO" << endl;
else
cout <<"YES" << endl;
}
B.Luba And The Ticket(补)
题意:给定长度为6的字符串。要求改变最少次,使得s[1]+s[2]+s[3]==s[4]+s[5]+s[6]。 每次可以改变一个数
思路:暴力
复杂度O(9^6)
CODE:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char str[50];
int main(void)
{
int ans=INT_MAX;
scanf("%s",str+1);
int i,j,k,a,b,c;
for(i=0; i<=9; i++)
{
for(j=0; j<=9; j++)
{
for(k=0; k<=9; k++)
{
for(a=0; a<=9; a++)
{
for(b=0; b<=9; b++)
{
for(c=0; c<=9; c++)
{
if(i+j+k == a+b+c)
{
int cnt=0;
if(str[1]-'0'!=i) cnt++;
if(str[2]-'0'!=j) cnt++;
if(str[3]-'0'!=k) cnt++;
if(str[4]-'0'!=a) cnt++;
if(str[5]-'0'!=b) cnt++;
if(str[6]-'0'!=c) cnt++;
ans=min(ans,cnt);
}
}
}
}
}
}
}
cout << ans << endl;
return 0;
}
C. Two TVs
题意:已知n个区间[L,R]。要求不出现一个点在三个集合的情况。
思路:用map来保存每一个区间的起点和终点。i.e. mp[L]++,mp[R+1]--。 模拟一遍即可。其中map的值代表当前点出现的次数。
CODE:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
map <int,int> mp;
int main(void)
{
int n;
cin>> n;
for(int i=1;i<=n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
mp[l]++,mp[r+1]--;
}
int sum=0;
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
{
sum+=it -> second;
if(sum>=3)
{
return 0*printf("NO\n");
}
}
return 0*printf("YES\n");
}