xp03
2025-07-30 19:51:23
发布于:河北
第一题
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("aaa.in","r",stdin);
freopen("aaa.out","w",stdout);
int n;
cin>>n;
int w[n+1],r[n+1];
for(int i=1;i<=n;i++){
cin>>r[i]>>w[i];
}
bool flag = true;
for(int i=1;i<=n-1;i++)if(w[i]>233)flag = false;
for(int i=2;i<=n;i++)if(r[i]<r[i-1] || w[i]<w[i-1])flag = false;
if(flag)cout<<"YES";
else cout<<"NO";
fclose(stdin);
fclose(stdout);
return 0;
}
第二题
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("bbb.in","r",stdin);
freopen("bbb.out","w",stdout);
int n,t;
cin>>n>>t;
string s;
cin>>s;
int a[n+1];
for(int i=1;i<=n;i++){
a[i] = s[i-1] - '0';
}
while(t--){
//运算
int b[n+1];
for(int i=1;i<=n;i++)b[i] = a[i];
for(int i=2;i<=n;i++){
a[i]=b[i-1]^b[i];
}
}
for(int i=1;i<=n;i++)cout<<a[i];
fclose(stdin);
fclose(stdout);
return 0;
}
第三题
#include <bits/stdc++.h>
using namespace std;
long long a[10010],tot;
// 从0年0月0日 - y年m月d日,总共的天数
long long day(int y,int m,int d){
long long ans = 0;
//年算完了
for(int i=0;i<y;i++){
ans+=tot;
if(i%4==0)ans++;
}
//月算完了
for(int i=1;i<m;i++){
ans+=a[i];
}
ans+=d;
return ans;
}
int main(){
freopen ("ccc.in", "r", stdin);
freopen ("ccc.out", "w", stdout);
int t;
cin >> t;
while (t--){
int n;
cin >> n;
tot = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
tot+=a[i];
}
int yb,mb,db,yc,mc,dc;
cin>>yb>>mb>>db>>yc>>mc>>dc;
long long ans = day(yc,mc,dc) - day(yb,mb,db) + 1;
cout<<ans<<endl;
}
fclose (stdin);
fclose (stdout);
return 0;
}
第四题
#include <bits/stdc++.h>
using namespace std;
int a[10010];
int main(){
freopen ("ddd.in", "r", stdin);
freopen ("ddd.out", "w", stdout);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
long long sum = 0;//攻击总和
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+n+1);//攻击力从小到大排序
//尽量让攻击力小的去防御,攻击力大的去进攻
//1 2 3 4 5 6 7 8 9 10
//假设前i个人防御,后n-i个人去攻击
long long mx = 0;
long long fyu = 0,gji = 0;
for(int i=1;i<=n;i++){
fyu+=1000-a[i];
gji+=a[i];
long long last = sum - gji;//后n-i个人去攻击
long long res = fyu*last;
mx = max(mx,res);
}
cout<<mx<<endl;
}
fclose (stdin);
fclose (stdout);
return 0;
}
公路
//已知车的油箱足够大,可以装下任意多的油,
// 反悔贪心
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
long long d[N],oil[N];
int main() {
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
long long n,v;//车站数量,1升油 跑v公里
cin>>n>>v;
for(int i=1;i<=n-1;i++)cin>>d[i];//i 到 i+1 的距离
for(int i=1;i<=n;i++)cin>>oil[i];//每个车站的油价
long long ans = 0;//最少花费
long long dis = 0;//到达 每个车站的实际距离
long long sum = 0;
for(int i=1;i<=n-1;i++){
long long mn_oil = 1e9;
sum+=d[i];
//遍历前面的最低油价
for(int j = i;j>=1;j--){
mn_oil = min(mn_oil,oil[j]);
}
long long cha = max(0LL,(sum - dis + v - 1) / v);// 最少买cha升油
ans+=cha*mn_oil;
dis+=cha*v;
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
公路优化 (前缀最小)
//已知车的油箱足够大,可以装下任意多的油,
// 反悔贪心
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
long long d[N],oil[N],pre[N];
int main() {
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
long long n,v;//车站数量,1升油 跑v公里
cin>>n>>v;
for(int i=1;i<=n-1;i++)cin>>d[i];//i 到 i+1 的距离
pre[0] = 1e9;
for(int i=1;i<=n;i++){
cin>>oil[i];//每个车站的油价
pre[i] = min(pre[i-1],oil[i]);
}
long long ans = 0;//最少花费
long long dis = 0;//到达 每个车站的实际距离
long long sum = 0;
for(int i=1;i<=n-1;i++){
long long mn_oil = pre[i];
sum+=d[i];
//遍历前面的最低油价
long long cha = max(0LL,(sum - dis + v - 1) / v);// 最少买cha升油
ans+=cha*mn_oil;
dis+=cha*v;
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
一元二次方程
#include<bits/stdc++.h>
using namespace std;
// 定义全局变量
long long T, M, a, b, c, delta;
// 计算最大公约数(GCD)
long long gcd(long long a, long long b) {
if (b == 0) return a; // 如果 b 为 0,返回 a
return gcd(b, a % b); // 递归计算 GCD
}
int main() {
freopen("uqe.in","r",stdin);
freopen("uqe.out","w",stdout);
// 输入方程数量 T 和系数上限 M
cin >> T >> M;
// 处理每个方程
while (T--) {
// 输入系数 a, b, c
cin >> a >> b >> c;
// 计算判别式 delta
delta = b * b - 4 * a * c;
// 根据判别式的值分类讨论
if (delta < 0) {
// 无实数解,输出 NO
printf("NO\n");
} else if (delta == 0) {
// 唯一解 x = -b / (2a)
long long p = -b, q = 2 * a;
// 约分
long long pq = gcd(abs(q), abs(p));
p /= pq, q /= pq;
// 确保分母为正
if (q < 0) q = -q, p = -p;
// 输出结果
if (q == 1) printf("%lld\n", p); // 整数解
else printf("%lld/%lld\n", p, q); // 分数解
} else {
// 两个实数解,输出较大的解
long long p = -b, q = 2 * a;
// 计算 sqrt(delta) 的整数部分
long long sq = (long long)sqrt(delta);
// 如果 delta 是完全平方数
if (sq * sq == delta) {
// 根据 a 的符号调整解
if (q > 0) p += sq;
else p -= sq;
// 约分
long long pq = gcd(abs(q), abs(p));
p /= pq, q /= pq;
// 确保分母为正
if (q < 0) q = -q, p = -p;
// 输出结果
if (q == 1) printf("%lld\n", p); // 整数解
else printf("%lld/%lld\n", p, q); // 分数解
} else {
// delta 不是完全平方数,解为无理数
// 先处理有理部分
long long pq = gcd(abs(q), abs(p));
p /= pq, q /= pq;
// 确保分母为正
if (q < 0) q = -q, p = -p;
// 输出有理部分
if (p != 0) {
if (q == 1) printf("%lld+", p); // 整数部分
else printf("%lld/%lld+", p, q); // 分数部分
}
// 处理无理部分
q = abs(2 * a); // 无理部分的分母
p = 1; // 无理部分的分子
long long t = 0; // 无理部分的根号内值
// 找到最大的 r,使得 r^2 整除 delta
for (int r = sq; r >= 1; r--) {
if (delta % (r * r) == 0) {
p *= r; // 更新分子
t = delta / (r * r); // 更新根号内值
break;
}
}
// 约分无理部分
pq = gcd(abs(q), abs(p));
p /= pq, q /= pq;
// 确保分母为正
if (q < 0) q = -q, p = -p;
// 输出无理部分
if (p == q) printf("sqrt(%lld)\n", t); // 分子等于分母
else if (q == 1) printf("%lld*sqrt(%lld)\n", p, t); // 分母为 1
else if (p == 1) printf("sqrt(%lld)/%lld\n", t, q); // 分子为 1
else printf("%lld*sqrt(%lld)/%lld\n", p, t, q); // 一般情况
}
}
}
fclose(stdin),fclose(stdout);
return 0;
}
dijkstra 堆优化
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 100010; // 把N改为150010就能ac
// 稀疏图用邻接表来存
int h[N], e[N], ne[N], idx;
int w[N]; // 用来存权重
int dist[N];
bool st[N]; // 如果为true说明这个点的最短路径已经确定
int n, m;
void add(int x, int y, int c)
{
// 有重边也不要紧,假设1->2有权重为2和3的边,再遍历到点1的时候2号点的距离会更新两次放入堆中
// 这样堆中会有很多冗余的点,但是在弹出的时候还是会弹出最小值2+x(x为之前确定的最短路径),
// 并标记st为true,所以下一次弹出3+x会continue不会向下执行。
w[idx] = c;
e[idx] = y;
ne[idx] = h[x];
h[x] = idx++;
}
int dijkstra()
{
memset(dist, 0x3f, sizeof(dist));
dist[1] = 0;
priority_queue<PII, vector<PII>, greater<PII>> heap; // 定义一个小根堆
// 这里heap中为什么要存pair呢,首先小根堆是根据距离来排的,所以有一个变量要是距离,
// 其次在从堆中拿出来的时候要知道知道这个点是哪个点,不然怎么更新邻接点呢?所以第二个变量要存点。
heap.push({ 0, 1 }); // 这个顺序不能倒,pair排序时是先根据first,再根据second,
// 这里显然要根据距离排序
while(heap.size())
{
PII k = heap.top(); // 取不在集合S中距离最短的点
heap.pop();
int ver = k.second, distance = k.first;
if(st[ver]) continue;
st[ver] = true;
for(int i = h[ver]; i != -1; i = ne[i])
{
int j = e[i]; // i只是个下标,e中在存的是i这个下标对应的点。
if(dist[j] > distance + w[i])
{
dist[j] = distance + w[i];
heap.push({ dist[j], j });
}
}
}
if(dist[n] == 0x3f3f3f3f) return -1;
else return dist[n];
}
int main()
{
memset(h, -1, sizeof(h));
scanf("%d%d", &n, &m);
while (m--)
{
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
add(x, y, c);
}
cout << dijkstra() << endl;
return 0;
}
旅游巴士
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 10005;
vector<pair<int, int>> g[N];
int d[N][105];
int state[N][105];
struct Node {
int u, i, d;
bool operator<(const Node &rhs) const {
return d > rhs.d;
}
};
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
while (m--) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
g[u].push_back({v, w});
}
memset(d, 0x3f, sizeof d);
priority_queue<Node> q;
q.push({1, 0, d[1][0] = 0});
while (q.size()) {
int u = q.top().u, i = q.top().i;
q.pop();
if (state[u][i]) continue;
state[u][i] = 1;
for (auto [v, w] : g[u]) {
int t = d[u][i], j = (i + 1) % k;//当前%k的值
if (t < w) t += (w - t + k - 1) / k * k;//如果小于开放时间,需要不断+k
if (d[v][j] > t + 1) q.push({v, j, d[v][j] = t + 1});//入队操作
}
}
if (d[n][0] == INF) d[n][0] = -1;
printf("%d\n", d[n][0]);
return 0;
}
城镇
#include <bits/stdc++.h>
using namespace std;
struct Node{
int id,rk;
string ji,jy;
}a[100010];
bool cmp(Node a,Node b){
if(a.jy!=b.jy) return a.jy<b.jy;
else{
if(a.ji!=b.ji) return a.ji<b.ji;
else{
if(a.rk!=b.rk) return a.rk>b.rk;
else return a.id<b.id;
}
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].id>>a[i].rk>>a[i].ji>>a[i].jy;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<a[i].id<<" "<<a[i].rk<<" "<<a[i].ji<<" "<<a[i].jy<<endl;
}
return 0;
}
乘方
#include <bits/stdc++.h>
using namespace std;
int main(){
freopen("pow.in" , "r" , stdin);
freopen("pow.out" , "w" , stdout);
int a , b;
cin >> a >> b;
if(a==1){
cout<<1;//特殊判断 a = 1的情况,否则会循环 1e9 次 会超时!!
}else{
int ans = 1;//乘法很容易溢出,每次循环判断
for(int i = 1;i <= b;i ++){
ans *= a;
if(ans > 1e9){
cout << -1;
return 0;
}
}
cout << ans;
}
fclose(stdin);
fclose(stdout);
return 0;
}
骗分大法———ceshuo管理员
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}a[510];
int n,k;
bool cmp(node a,node b){
//先按左端点从小到大 ,再按右端点从小到大
if(a.y!=b.y)return a.y<b.y;
return a.x<b.x;
}
bool flag[510];
int ans = 0;
void dfs(int u){
if(u==n+1){
int l = -1,r = -1;
int sum = 0;
for(int i=1;i<=n;i++){
if(flag[i]){
//第一个同学
if(l==-1 && r==-1){
l = a[i].x;
r = a[i].y;
sum++;
}else{
//横坐标、纵坐标值均单调不减,并且直线距离为 1
if(a[i].x>=l && a[i].y>=r && (abs(a[i].x-l)+abs(a[i].y-r)) == 1){
sum++;
l = a[i].x;
r = a[i].y;
}
}
}
}
ans = max(ans,sum);
return;
}
flag[u] = true;//上
dfs(u+1);
flag[u] = false;
dfs(u+1);
}
int main(){
freopen("point.in","r",stdin);
freopen("point.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+n+1,cmp);
dfs(1);
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
解密 20分
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("decode.in", "r", stdin);
freopen("decode.out", "w", stdout);
int k;
cin >> k;
while(k--){
long long n, d, e;
cin >> n >> d >> e;
// n = q*p
// ed = (p-1)*(q-1)+1
// 暴力枚举 q
int ansp = 0,ansq = 0;
for(int p=1;p<=n;p++){
if(n%p==0){
int q = n/p;
if((p-1)*(q-1)+1==e*d && p<=q){
ansp = p;
ansq = q;
}
}
}
if(ansp==0 && ansq==0)cout<<"NO"<<endl;
else cout<<ansp<<" "<<ansq<<endl;
}
fclose(stdin);
fclose(stdout);
}
解密 60分
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("decode.in", "r", stdin);
freopen("decode.out", "w", stdout);
int k;
cin >> k;
while(k--){
long long n, d, e;
cin >> n >> d >> e;
// n = q*p
// ed = (p-1)*(q-1)+1
// 暴力枚举 q
int ansp = 0,ansq = 0;
for(int p=1;p<=sqrt(n);p++){
if(n%p==0){
int q = n/p;
if((p-1)*(q-1)+1==e*d && p<=q){
ansp = p;
ansq = q;
}
}
}
if(ansp==0 && ansq==0)cout<<"NO"<<endl;
else cout<<ansp<<" "<<ansq<<endl;
}
fclose(stdin);
fclose(stdout);
}
解密 100分
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("decode.in", "r", stdin);
freopen("decode.out", "w", stdout);
int k;
cin >> k;
for(int i=1; i<=k; i++){
long long n, d, e, p, q, ans, m, temp;
cin >> n >> d >> e;
m = n-(e*d)+2; //m = p+q
temp = m*m-4*n; // (q-p)(q-p)
long long dif = sqrt(temp);
if(temp<0)cout << "NO" << endl; //保险特判
else if(dif * dif!=temp)cout << "NO" << endl; //q - p is not an integer
else {
q = (m+dif)/2; // p+q+(q-p) = 2q
p = (m-dif)/2; // p+q-(q-p) = 2p
cout << min(p, q) << " " << max(p, q) << endl;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}
最长上升子序列
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("decode.in", "r", stdin);
freopen("decode.out", "w", stdout);
int n;
cin>>n;
int a[n+1],dp[n+1];
//最长上升子序列
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
dp[i] = 1;
//前面继承
for(int j=1;j<i;j++){
if(a[i] >= a[j]){
dp[i] = max(dp[j] + 1,dp[i]);
}
}
}
int ans = 0;
for(int i=1;i<=n;i++)ans=max(ans,dp[i]);
cout<<ans;
fclose(stdin);
fclose(stdout);
}
40分 特殊条件 k==0
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}a[510];
int n,k,dp[510];
bool cmp(node a,node b){
//先按左端点从小到大 ,再按右端点从小到大
if(a.y!=b.y)return a.y<b.y;
return a.x<b.x;
}
//左端点不用管,此时右端点是无序的
int main(){
freopen("point.in","r",stdin);
freopen("point.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
//a[i].x a[i].y
dp[i] = 1;
for(int j=1;j<i;j++){
if(a[i].y>=a[j].y && abs(a[i].y-a[j].y)+abs(a[i].x-a[j].x)==1){
dp[i] = max(dp[i],dp[j]+1);
}
}
}
int ans = 0;
for(int i=1;i<=n;i++)ans=max(ans,dp[i]);
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
背包问题+最长上升子序列
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}a[510];
bool cmp(node a,node b){
if(a.y!=b.y)return a.y<b.y;
return a.x<b.x;
}
int dp[510][110];
int main(){
freopen("point.in","r",stdin);
freopen("point.out","w",stdout);
int n,k;
cin>>n>>k;
//从前i个坐标处,已经添加了k个点,的最大长度
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+n+1,cmp);
//我按照右端点从小到大
//最长上升子序列 随机从中取出,就是子序列问题,并且是取比自己x坐标小的
for(int i=1;i<=n;i++){
dp[i][0] = 1;
for(int j=0;j<=k;j++){
for(int t=1;t<i;t++){
if(a[i].x>=a[t].x){
int sum = a[i].x-a[t].x+a[i].y-a[t].y - 1;
//求出需要多少个k才能转移
if(j>=sum)dp[i][j] = max(dp[i][j],dp[t][j-sum]+sum+1);
}
}
}
}
int ans = 0;
for(int i=1;i<=n;i++){
for(int j=0;j<=k;j++){
ans=max(ans,dp[i][j]+(k-j));
}
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
逻辑表达式
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <stack>
using namespace std;
struct Data{
bool f;
int conflict1, conflict2;
}data;
stack<Data > num;
stack<char > op;
void eval(){
auto b = num.top(); num.pop();
auto a = num.top(); num.pop();
auto c = op.top(); op.pop();
Data x;
if(c == '&'){
if(!a.f){
x.f = 0;
x.conflict1 = a.conflict1 + 1;
x.conflict2 = a.conflict2;
}
else{
x.f = a.f & b.f;
x.conflict1 = a.conflict1 + b.conflict1;
x.conflict2 = a.conflict2 + b.conflict2;
}
}
else{
if(a.f){
x.f = 1;
x.conflict1 = a.conflict1;
x.conflict2 = a.conflict2 + 1;
}
else{
x.f = a.f | b.f;
x.conflict1 = a.conflict1 + b.conflict1;
x.conflict2 = a.conflict2 + b.conflict2;
}
}
num.push(x);
}
int main(){
freopen("expr.in","r",stdin);
freopen("expr.out","w",stdout);
string s;
cin >> s;
unordered_map<char , int > pr{{'|', 1}, {'&', 2}};
for(int i = 0; i < s.size(); i ++ ){
auto c = s[i];
if(isdigit(c)){
Data temp;
temp.f = c - '0';
temp.conflict1 = temp.conflict2 = 0;
num.push(temp);
}
else if(c == '('){
op.push(c);
}
else if(c == ')'){
while(op.top() != '('){
eval();
}
op.pop();
}
else{
while(op.size() && op.top() != '(' && pr[op.top()] >= pr[c]) eval();
op.push(c);
}
}
while(op.size()) eval();
cout << num.top().f << endl;
cout << num.top().conflict1 << " " << num.top().conflict2 << endl;
fclose(stdin);
fclose(stdout);
return 0;
}
求因数个数 时间复杂度 sqrt(n)
#include <bits/stdc++.h>
using namespace std;
int main(){
freopen ("factor.in", "r", stdin);
freopen ("factor.out", "w", stdout);
int n;
cin >> n;
if (n == 1){
cout << 1;
return 0;
}
int ans = 2;
for (int i = 2; i * i <= n; i++){
if (n % i == 0){
if (n / i != i){
ans += 2;
}else{
ans += 1;
}
}
}
cout << ans;
return 0;
fclose (stdin);
fclose (stdout);
}
五子棋
#include <iostream>
#include <vector>
using namespace std;
const int dir[8][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}, {1, -1}, {-1, 1}, {1, 1}, {-1, -1}};
inline int mod(int x, int m) {
return (x % m + m) % m;
}
int main() {
freopen("gobang.in", "r", stdin);
freopen("gobang.out", "w", stdout);
int n, m, t;
cin >> n >> m >> t;
t += 1;
vector<vector<int>> g(n, vector<int>(m));
vector<vector<int>> back_up(n, vector<int>(m));
for (int i = 0; i < n; i++) {
string s;
cin >> s;
for (int j = 0; j < m; j++) {
back_up[i][j] = g[i][j] = s[j] - '0';
}
}
while (t-- > 0) {
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
g[i][j] = back_up[i][j];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int cnt = 0;
for (int k = 0; k < 8; k++) {
int ni = mod(i + dir[k][0], n);
int nj = mod(j + dir[k][1], m);
if (g[ni][nj] == 1) cnt++;
}
if (g[i][j] == 1) {
if (cnt < 2) back_up[i][j] = 0;
else if (cnt <= 3) back_up[i][j] = 1;
else back_up[i][j] = 0;
} else {
if (cnt == 3) back_up[i][j] = 1;
}
int a[4] = {1, 1, 1, 1};
for (int k = 0; k <= 4; k++) {
if (g[mod(i + k, n)][j] == 0) {
a[0] = 0;
break;
}
}
for (int k = 0; k <= 4; k++) {
if (g[i][mod(j + k, m)] == 0) {
a[1] = 0;
break;
}
}
for (int k = 0; k <= 4; k++) {
if (g[mod(i + k, n)][mod(j + k, m)] == 0) {
a[2] = 0;
break;
}
}
for (int k = 0; k <= 4; k++) {
if (g[mod(i - k, n)][mod(j + k, m)] == 0) {
a[3] = 0;
break;
}
}
for (int k = 0; k < 4; k++) {
ans += a[k];
}
}
}
cout << ans << "\n";
}
fclose(stdin);
fclose(stdout);
return 0;
}
小木棍
#include<iostream>
using namespace std;
int ans[10] = { -1,-1,1,7,4,2,6 };
int main() {
freopen("sticks.in","r",stdin);
freopen("sticks.out","w",stdout);
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
if (n < 7) {//n<7时单独判断
cout << ans[n] << endl;
}
else {
int k = n / 7;//n=7*k+r,r表示余数
if (n % 7 == 0) cout << 8;//分情况讨论
else if (n % 7 == 1) cout << 10;
else if (n % 7 == 2) cout << 18;
else if (n % 7 == 3) {
if (n == 10) cout << 22;//拆1个8
else {
cout << 200;//拆2个8
k--;//注意k要减1
}
}
else if (n % 7 == 4) cout << 20;
else if (n % 7 == 5) cout << 28;
else cout << 68;
for (int i = 1; i < k; i++) {//输出k-1个8
cout << 8;
}
cout << endl;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}
#include<iostream>
using namespace std;
int a[10] = {6,2,5,5,4,5,6,3,7,6};
long long ans = 1e18;
int x = 0;
void dfs(int u,long long res,int sum){
if(sum>x)return;
if(res>ans)return;
if(sum==x){
ans = min(ans,res);
return;
}
for(int i=(u==1)?1:0;i<=9;i++){
dfs(u+1,res*10+i,sum+a[i]);
}
}
int main() {
for(int i=0;i<=1000;i++){
ans = 1e18;
x = i;
dfs(1,0,0);
cout<<i<<" "<<ans<<endl;
}
return 0;
}
地图探险
#include<bits/stdc++.h>
using namespace std;
char a[1105][1105];
bool vis[1105][1105];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int main(){
freopen("explore.in", "r", stdin);
freopen("explore.out", "w", stdout);
int t;
cin>>t;
while(t--){
int n,m,k,x,y,d;
cin>>n>>m>>k>>x>>y>>d;//行 列 机器人走路次数 机器人下标(x,y) 机器人初始的方向
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
vis[i][j]=0;
}
}
int ans = 0;
vis[x][y] = 1;
while(k--){
int nx = x + dx[d];
int ny = y + dy[d];
if(nx>=1 && nx<=n && ny>=1 && ny<=m && a[nx][ny]=='.'){
x = nx;
y = ny;
vis[x][y] = 1;
}else{
d = (d+1)%4;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis[i][j])ans++;
cout<<ans<<endl;
}
fclose(stdin);
fclose(stdout);
}
这里空空如也
有帮助,赞一个