1.一个模拟题
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
#define db double
#define INF 0x3f3f3f3f
const int mxn = 2005;
int n, k;
struct Node
{
db a, b;
int x;
int sum;
bool operator < (const Node z) const
{
if(sum == z.sum)
return x < z.x;
return sum > z.sum;
}
} st[mxn];
db mrk[mxn][mxn];
db ar[mxn], arr[mxn];
int brr[mxn]; //统计每个队伍的数量
char c[2];
int main()
{
scanf("%d %d", &n, &k);
for(int i = 1; i <= n; i ++)
{
scanf("%lf %s", &st[i].a, c), st[i].a *= 0.6;
st[i].x = c[0] - 'A' + 1;
}
for(int i = 1; i <= k; i ++)
{
for(int j = 1; j <= k; j ++)
scanf("%lf", &mrk[i][j]), ar[j] += mrk[i][j];
}
for(int i = 1; i <= k; i ++)
{
ar[i] /= k;
}
for(int i = 1; i <= k; i ++)
{
for(int j = 1; j <= k; j ++)
{
if(mrk[i][j] >= ar[j] - 15 && mrk[i][j] <= ar[j] + 15)
arr[j] += mrk[i][j], brr[j] ++;
}
}
for(int i = 1; i <= k; i ++)
{
arr[i] = round(arr[i]/brr[i]);
}
for(int i = 1; i <= n; i ++)
{
st[i].b = arr[st[i].x] * 0.4;
st[i].sum = round(st[i].a + st[i].b);
}
sort(st + 1, st + 1 + n);
for(int i = 1; i <= n; i ++)
{
printf("%d %c\n", st[i].sum, st[i].x + 'A' - 1);
}
return 0;
}
2.贪心
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<cstring>
using namespace std;
#define ll long long
const int mxn = 1e6 + 10;
int ar[mxn];
ll br[mxn];
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &ar[i]), br[i] = 1;
for(int i = 2; i <= n; i ++)
{
if(ar[i] > ar[i - 1])
br[i] = br[i - 1] + 1;
else if(ar[i] == ar[i - 1])
br[i] = br[i - 1];
}
for(int i = n - 1; i >= 1; i --)
{
if(ar[i] > ar[i + 1] && br[i] <= br[i + 1])
br[i] = br[i + 1] + 1;
else if(ar[i] == ar[i + 1])
br[i] = max(br[i], br[i + 1]);
}
ll sum = 0;
for(int i = 1; i <= n; i ++)
sum += br[i];
printf("%lld\n", sum);
return 0;
}
3.map一下
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
#define ll long long
#define db double
#define INF 0x3f3f3f3f
const int mxn = 1e6 + 10;
int ar[mxn], br[mxn];
int n;
map<int, int> mp;
int main()
{
scanf("%d", &n);
int x, y;
for(int i = 1; i <= n; i ++)
{
scanf("%d %d", &x, &y);
ar[i] = x;
br[i] = x^y;
mp[ar[i]] ++;
if(ar[i] != br[i])
mp[br[i]] ++;
}
int mx = -1, val;
for(auto x : mp)
{
if(mx < x.second)
{
mx = x.second;
val = x.first;
}
}
printf("%d\n", val);
return 0;
}
4.开关
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<cstring>
using namespace std;
const int mxn = 1e6 + 10;
map<char, string> mp, tr;
char ar[mxn];
int br[mxn << 2];
int main()
{
//freopen("A.txt","r",stdin);
//freopen("Ans.txt","w",stdout);
mp['0'] = "0000"; tr['0'] = "0000";
mp['1'] = "0001"; tr['1'] = "1000";
mp['2'] = "0010"; tr['2'] = "0100";
mp['3'] = "0011"; tr['3'] = "1100";
mp['4'] = "0100"; tr['4'] = "0010";
mp['5'] = "0101"; tr['5'] = "1010";
mp['6'] = "0110"; tr['6'] = "0110";
mp['7'] = "0111"; tr['7'] = "1110";
mp['8'] = "1000"; tr['8'] = "0001";
mp['9'] = "1001"; tr['9'] = "1001";
mp['A'] = "1010"; tr['A'] = "1010";
mp['B'] = "1011"; tr['B'] = "1101";
mp['C'] = "1100"; tr['C'] = "0011";
mp['D'] = "1101"; tr['D'] = "1011";
mp['E'] = "1110"; tr['E'] = "0111";
mp['F'] = "1111"; tr['F'] = "1111";
scanf("%s", ar);
string s;
int n = strlen(ar);
s += "0";
for(int i = 0; i < n; i ++)
s += mp[ar[i]];
s += "0"; //补0操作
int l = 0, r = s.size() - 1;
while(s[l] == '0')
l ++;
s[l - 1] = '1';
string ss = s;
int ans1 = 0;
//第一次修改前两个
for(int i = l; i < r; i ++)
{
if(s[i - 1] == '1')
{
s[i - 1] = '0';
ans1 ++;
if(s[i] == '1')
s[i] = '0';
else
s[i] = '1';
if(s[i+1] == '1')
s[i+1] = '0';
else
s[i+1] = '1';
}
}
for(int i = l; i < r; i ++)
if(s[i] == '1')
{
ans1 = -1;
break;
}
int ans2 = 0;
//第一次修改前三个
for(int i = l + 2; i <= r; i ++)
{
if(ss[i - 2] == '1')
{
ss[i - 2] = '0';
ans2 ++;
if(ss[i - 1] == '1')
ss[i - 1] = '0';
else
ss[i - 1] = '1';
if(ss[i] == '1')
ss[i] = '0';
else
ss[i] = '1';
}
}
for(int i = l; i < r; i ++)
{
if(ss[i] == '1')
{
ans2 = -1;
break;
}
}
if(ans1 == -1 && ans2 == -1)
printf("No\n");
else if(ans1 == -1)
printf("%d\n", ans2);
else if(ans2 == -1)
printf("%d\n", ans1);
else
printf("%d\n", min(ans1, ans2));
return 0;
}