P2580 于是他错误的点名开始了 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(字典树)
#include<iostream>
#include<string>
using namespace std;
int nex[500005][27],cnt=1,ext[500005];
void in(string s){
int p=0;
for(int i=0;i<s.size();i++){
int c=s[i]-'0';
if(!nex[p][c])nex[p][c]=++cnt;
p=nex[p][c];
}
ext[p]=1;
}
void find(string s){
int p=0;
for(int i=0;i<s.size();i++){
int c=s[i]-'0';
p=nex[p][c];
if(!p)break;
}
if (ext[p] == 1) {
ext[p] = 2;
puts("OK");
} else if (ext[p] == 2)
puts("REPEAT");
else
puts("WRONG");
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
string s;
cin>>s;
in(s);
}
int m;
cin>>m;
for(int i=0;i<m;i++){
string s;
cin>>s;
find(s);
}
}
Problem - C - Codeforces(异或和)-----重点学习
#include<iostream>
#include<set>
using namespace std;
int a[100005];
void solve(){
int n;
cin>>n;
int sum=0;
int ans=0;
for(int i=0;i<n;i++){
cin>>a[i];
}
set<int>st;
for(int i=0;i<n;i++){
sum^=a[i];
ans=max(ans,sum);
for(auto it:st){
ans=max(ans,sum^it);
}
st.insert(sum);
}
cout<<ans<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int a[200005];
typedef pair<int,long long>PII;
vector< PII>q;
bool cmp(PII x,PII y){
if(x.first!=y.first)return x.first>y.first;
return x.second<y.second;
}
void solve(){
q.clear();
int n,k,sum;
long long l,r;
cin>>n>>k>>sum;
for(int i=0;i<n;i++){
long long cnt=0,w=0;
for(int j=0;j<k;j++){
cin>>a[j];
cnt+=cnt+a[j];
}
sort(a,a+k);
long long p=0;
int t=0,f=1;
for(t=0;t<k;t++){
if(p+a[t]>sum){
q.push_back({t,w});
f=0;
break;
}
p=p+a[t];
w+=p;
}
if(f==1){
q.push_back({k,w});
}
}
l=q[0].first,r=q[0].second;
sort(q.begin(),q.end(),cmp);
for(int i=0;i<n;i++){
int s=q[i].first;
}
for(int i=1;i<=n;i++){
if(q[i-1].first==l&&q[i-1].second==r){
cout<<i<<endl;
return ;
}
}
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
Dashboard - Codeforces Round 883 (Div. 3) - Codeforces (精度问题,需了解)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
double a[200005];
void solve(){
double n,d,h;
cin>>n>>d>>h;
double ans=(double)d*(double)h*1.0/2;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
ans+=d*h*1.0/2;
if(a[i-1]+h>a[i]){
double h1=h-(a[i]-a[i-1]);
double d1=(h1*1.0*d)/2/h;
ans-=h1*d1*1.0;
}
}
printf("%.8lf\n",ans);
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
P2196 [NOIP1996 提高组] 挖地雷 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
struct node{
vector<int>an;
int cnt;
}ans[105];
bool vis[25];
int map[25][25];
int a[25];
int t;
void dfs(int x,vector<int>&q,int sum){
vis[x]=true;
for(int i=1;i<=n;i++){
if(!vis[i]&&map[x][i]==1){
q.push_back(i);
dfs(i,q,sum+a[i]);
q.pop_back();
}
}
ans[t].cnt=sum;
for(int i=0;i<q.size();i++){
ans[t].an.push_back(q[i]);
}
t++;
return;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n-1;i++){
for(int j=i+1;j<=n;j++){
int q;
cin>>q;
map[i][j]=q;
}
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
vector<int>q;
q.push_back(i);
dfs(i,q,a[i]);
}
int p,o=0;
for(int i=0;i<t;i++){
if(o<ans[i].cnt){
o=ans[i].cnt;
p=i;
}
}
for(int i=0;i<ans[p].an.size();i++){
cout<<ans[p].an[i]<<' ';
}
cout<<endl;
cout<<o<<endl;
}
931. 下降路径最小和 - 力扣(LeetCode)(dp)
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
vector<int>dp[105];
for(int i=0;i<matrix[0].size();i++){
dp[0].push_back(matrix[0][i]);
}
if(matrix[0].size()==1){
int ans=0;
for(int i=0;i<matrix.size();i++){
ans+=matrix[i][0];
}
return ans;
}
for(int i=1;i<matrix.size();i++){
for(int j=0;j<matrix[i].size();j++){
int k=dp[i-1][j];
if(j==0){
k=min(dp[i-1][j],dp[i-1][j+1]);
}
else if(j==matrix[i].size()-1){
k=min(dp[i-1][j],dp[i-1][j-1]);
}
else {
k=min(k,min(dp[i-1][j+1],dp[i-1][j-1]));
}
dp[i].push_back(k+matrix[i][j]);
}
}
int ans=dp[matrix.size()-1][0];
for(int i=0;i<matrix[0].size();i++){
ans=min(ans,dp[matrix.size()-1][i]);
}
return ans;
}
};
优化
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
int n = matrix.size();
vector<vector<int>> dp(n, vector<int>(n));
copy(matrix[0].begin(), matrix[0].end(), dp[0].begin());
for (int i = 1; i < n; i++) {
for (int j = 0; j < n; j++) {
int mn = dp[i - 1][j];
if (j > 0) {
mn = min(mn, dp[i - 1][j - 1]);
}
if (j < n - 1) {
mn = min(mn, dp[i - 1][j + 1]);
}
dp[i][j] = mn + matrix[i][j];
}
}
return *min_element(dp[n - 1].begin(), dp[n - 1].end());
}
};