目录
一、矩形总面积
思路:
代码:
二、错误票据
思路:
代码:
三、分糖果1
思路:
代码:
四、三国游戏
思路:
代码:
五、分糖果2
思路:
代码:
一、矩形总面积
思路:
1、分四种情况为没有重叠 (x[2] < x[3] || y[2] < y[3] || x[4] < x[1] || y[4] < y[1]),这种情况下输出为两矩形面积之和。
2、重叠的情况下输出为两个矩形的面积之和减去重叠面积之和。
3、重叠面积:
长为:小的右上角坐标减去大的左下角坐标
宽为:小的右上角坐标减去大的左下角坐标
面积:长×宽
代码:
#include <iostream>
using namespace std;
int main()
{
long long x[5], y[5];
for (int i = 1; i <= 4; i++)
cin >> x[i] >> y[i];
long long ans = (x[2] - x[1]) * (y[2] - y[1]) + (x[4] - x[3]) * (y[4] - y[3]);
if (x[2] < x[3] || y[2] < y[3] || x[4] < x[1] || y[4] < y[1])//完全不重叠
cout << ans;
else
{
long long a = abs(max(x[1], x[3]) - min(x[2], x[4]));
long long b = abs(max(y[1], y[3]) - min(y[2], y[4]));
cout << ans - a * b;
}
return 0;
}
二、错误票据
思路:
1、用数组下标来表示数,记录数出现的次数。
2、记录最小,最大值,从最小到最大遍历
3、等于0,则为断号ID;等于1,则出现一次;超过1,则为重号ID。
代码:
#include <iostream>
using namespace std;
int main()
{
int a[10010] = { 0 };
int n, temp, max=0, min=1e9;
cin >> n;
while (n--)
{
while (cin >> temp)
{
if (temp > max)
max = temp;
if (temp < min)
min = temp;
a[temp]++;
}
}
int m, d;
for (int i = min; i <= max; i++)
{
if (a[i] == 0)
m = i;
else if (a[i] > 1)
d = i;
}
cout << m << " " << d;
}
三、分糖果1
思路:
1、将字符串从小到大排序
2、相差度要尽量小,分为三种情况
3、第一种:全都一样,则分成x组,奇数则后面的多加一个
第二种:第x个与第一个一样,则从第x个到最后
第三种:第1个到第x个都不一样,输出第x个
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n, x;
cin >> n >> x;
char s[1000010];
for(int i=1;i<=n;i++)
cin >> s[i];
sort(s+1, s + n+1 );
//for (int i = 1; i <= n; i++)
//cout << s[i];
if (s[1] == s[n])//全都一样,则分成x组,奇数则后面的多加一个
{
int cnt;
if (n % x == 0)
cnt = n / x;
else
cnt = n / x + 1;
for (int i = 1; i <= cnt; i++)
cout << s[i];
}
else if (s[x] == s[1])//第x个与第一个一样,则从第x个到最后
{
for (int i = x; i <= n; i++)
cout << s[i];
}
else//输出第x个
cout << s[x];
}
四、三国游戏
思路:
1、分三种情况:x赢,y赢,z赢
2、分三种情况排序,第一种根据x和(y+z)的差值排序,第二种根据y和(x+z)的差值排序,第三种根据z和(x+y)的差值排序
3、遍历,求出最大ans,没有则输出-1
代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int x, y, z;
}a[100010];
bool cmp1(node a, node b)//根据x 和(y+z)的差值排序
{
return a.x - (a.y + a.z) > b.x - (b.y + b.z);
}
bool cmp2(node a, node b)//根据y 和(x+z)的差值排序
{
return a.y - (a.x + a.z) > b.y - (b.x + b.z);
}
bool cmp3(node a, node b)//根据z 和(x+y)的差值排序
{
return a.z - (a.y + a.x) > b.z - (b.y + b.x);
}
int main()
{
int n;
cin >> n;
long long ans = -1, sum1 = 0, sum2 = 0;
for (int i = 0; i < n; i++)
cin >> a[i].x;
for (int i = 0; i < n; i++)
cin >> a[i].y;
for (int i = 0; i < n; i++)
cin >> a[i].z;
sort(a, a + n, cmp1);//x赢
for (int i = 0; i < n; i++)
{
sum1 += a[i].x;
sum2 += a[i].y + a[i].z;
if (sum1 > sum2 && ans <= i + 1)
ans = i + 1;
}
sum1 = 0, sum2 = 0;
sort(a, a + n, cmp2);//y赢
for (int i = 0; i < n; i++)
{
sum1 += a[i].y;
sum2 += a[i].x + a[i].z;
if (sum1 > sum2 && ans <= i + 1)
ans = i + 1;
}
sum1 = 0, sum2 = 0;
sort(a, a + n, cmp3);//z赢
for (int i = 0; i < n; i++)
{
sum1 += a[i].z;
sum2 += a[i].y + a[i].x;
if (sum1 > sum2 && ans <= i + 1)
ans = i + 1;
}
cout << ans;
}
五、分糖果2
思路:
1、模拟传递糖果,分发糖果
2、每个小朋友每轮过后手上糖果数量为a[i] = a[i] / 2 + a[i + 1] / 2,最后一个小朋友的为a[n] = a[n] / 2 + a[1]/2;
3、循环,直到所有小朋友糖果都一样,跳出循环
代码:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[105];
int ans = 0;
for (int i = 1; i <= n; i++)
cin >> a[i];
while (1)
{
int temp = a[1] / 2;
for (int i = 1; i < n; i++)
{
a[i] = a[i] / 2 + a[i + 1] / 2;
}
a[n] = a[n] / 2 + temp;
int flag = 1;
for (int i = 1; i <= n; i++)
{
if (a[i] != a[1])
{
flag = 0;
}
if (a[i] % 2 == 1)
{
a[i] += 1;
ans++;
}
}
if (flag == 1)
break;
}
cout << ans;
}