1. 门禁系统
#include<stdio.h>
#define MAXN 1005
int main(){
int n,d;
int arr[MAXN] = {0};
scanf("%d",&n);
while(n--){
scanf("%d",&d);
printf("%d ",++arr[d]);
}
return 0;
}
5
1 2 1 1 3
1 1 2 3 1
2. Z字形扫描
#include<stdio.h>
#define MAXN 505
int mat[MAXN][MAXN];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&mat[i][j]);
}
}
int i=0,j=0;
int dir=0;
while(i>=0 && i<n && j>=0 && j<n){
printf("%d ",mat[i][j]);
if(i==n-1 && j==n-1) break;
if(i==0 && j!=n-1){
j++;
dir=1;
printf("%d ",mat[i][j]);
}
else if(j==0 && i!=n-1){
i++;
dir=-1;
printf("%d ",mat[i][j]);
}
else if(i==n-1){
j++;
dir=-1;
printf("%d ",mat[i][j]);
}
else if(j==n-1){
i++;
dir=1;
printf("%d ",mat[i][j]);
}
i+=dir;
j-=dir;
}
return 0;
}
4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
3. 集合竞价
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct Record {
string command;
float price;
long long turnover;
int flag;
};
struct Money {
float price;
long long bNum,sNum;
};
vector<Record> rec;
vector<Money> mon;
bool cmp(const Record &a,const Record &b) {
if(a.flag == b.flag && a.flag == 1) {
return a.price < b.price;
}
return a.flag > b.flag;
}
void find(string cmd, float p, long long num) {
int i;
Money m;
for(i = 0; i < mon.size(); i++) {
if(mon[i].price == p) {
if(cmd == "buy") {
mon[i].bNum += num;
} else {
mon[i].sNum += num;
}
break;
}
}
if(i == mon.size()) {
m.price = p;
if(cmd == "buy") {
m.bNum = num;
m.sNum = 0;
} else {
m.sNum = num;
m.bNum = 0;
}
mon.push_back(m);
}
}
int main() {
Record r;
int k;
while(cin >> r.command) {
if(r.command == "buy" || r.command == "sell") {
cin >> r.price >> r.turnover;
r.flag = 1;
} else if(r.command == "cancel") {
cin >> k;
rec[k-1].flag = 0;
r.flag = 0;
} else break;
rec.push_back(r);
}
sort(rec.begin(), rec.end(), cmp);
for(int i = (int)rec.size() - 1; i > -1; i--) {
if(rec[i].flag == 1) {
find(rec[i].command, rec[i].price, rec[i].turnover);
}
}
long long max = -1;
float OpeanPrice = mon[0].price;
for(int i = 0; i < mon.size(); i++) {
long long sumb = 0, sums = 0;
for(int j = 0; j <= i; j++)
sumb += mon[j].bNum;
for(int j = i; j < mon.size(); j++)
sums += mon[j].sNum;
long long m = sumb < sums ? sumb : sums;
if(max < m) {
max = m;
OpeanPrice = mon[i].price;
}
}
printf("%.2f %lld\n", OpeanPrice, max);
return 0;
}
buy 9.25 100
buy 8.88 175
sell 9.00 1000
buy 9.00 400
sell 8.92 400
cancel 1
buy 100.00 50
9.00 450
4. 最优灌溉
#include<iostream>
#include<algorithm>
using namespace std;
const int maxx=100010;
int n,m,ans,tot,father[maxx];
struct node
{
int u;
int v;
int w;
}e[maxx];
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void unionn(int a,int b)
{
int fa=find(a);
int fb=find(b);
father[fa]=fb;
}
bool cmp(const node &a,const node &b)
{
return a.w<b.w;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>e[i].u>>e[i].v>>e[i].w;
for(int i=1;i<=n;i++)
father[i]=i;
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(find(e[i].u)!=find(e[i].v))
{
unionn(e[i].u,e[i].v);
tot++;
ans+=e[i].w;
}
if(tot==n-1)
break;
}
cout<<ans;
return 0;
}
4 4
1 2 1
2 3 4
2 4 2
3 4 3
6
5. 货物调度